if (bus->response_reset) {
                        codec_dbg(codec,
                                  "resetting BUS due to fatal communication error\n");
-                       bus->ops.bus_reset(bus);
+                       snd_hda_bus_reset(bus);
                }
                goto again;
        }
        struct hda_pcm *cpcm;
        int dev, err;
 
-       if (snd_BUG_ON(!bus->ops.attach_pcm))
-               return -EINVAL;
-
        err = snd_hda_codec_parse_pcms(codec);
        if (err < 0) {
                snd_hda_codec_reset(codec);
                if (dev < 0)
                        continue; /* no fatal error */
                cpcm->device = dev;
-               err =  bus->ops.attach_pcm(bus, codec, cpcm);
+               err =  snd_hda_attach_pcm_stream(bus, codec, cpcm);
                if (err < 0) {
                        codec_err(codec,
                                  "cannot attach PCM stream %d for codec #%d\n",
 EXPORT_SYMBOL_GPL(snd_hda_add_imux_item);
 
 /**
- * snd_hda_bus_reset - Reset the bus
+ * snd_hda_bus_reset_codecs - Reset the bus
  * @bus: HD-audio bus
  */
-void snd_hda_bus_reset(struct hda_bus *bus)
+void snd_hda_bus_reset_codecs(struct hda_bus *bus)
 {
        struct hda_codec *codec;
 
 #endif
        }
 }
-EXPORT_SYMBOL_GPL(snd_hda_bus_reset);
 
 /**
  * snd_print_pcm_bits - Print the supported PCM fmt bits to the string buffer
 
 struct hda_pcm;
 struct hda_pcm_stream;
 
-/* bus operators */
-struct hda_bus_ops {
-       /* attach a PCM stream */
-       int (*attach_pcm)(struct hda_bus *bus, struct hda_codec *codec,
-                         struct hda_pcm *pcm);
-       /* reset bus for retry verb */
-       void (*bus_reset)(struct hda_bus *bus);
-#ifdef CONFIG_SND_HDA_DSP_LOADER
-       /* prepare DSP transfer */
-       int (*load_dsp_prepare)(struct hda_bus *bus, unsigned int format,
-                               unsigned int byte_size,
-                               struct snd_dma_buffer *bufp);
-       /* start/stop DSP transfer */
-       void (*load_dsp_trigger)(struct hda_bus *bus, bool start);
-       /* clean up DSP transfer */
-       void (*load_dsp_cleanup)(struct hda_bus *bus,
-                                struct snd_dma_buffer *dmab);
-#endif
-};
-
 /*
  * codec bus
  *
 
        struct pci_dev *pci;
        const char *modelname;
-       struct hda_bus_ops ops;
 
        struct mutex prepare_mutex;
 
 
 extern const struct snd_pcm_chmap_elem snd_pcm_2_1_chmaps[];
 
+int snd_hda_attach_pcm_stream(struct hda_bus *_bus, struct hda_codec *codec,
+                             struct hda_pcm *cpcm);
+
 /*
  * Misc
  */
 int snd_hda_lock_devices(struct hda_bus *bus);
 void snd_hda_unlock_devices(struct hda_bus *bus);
 void snd_hda_bus_reset(struct hda_bus *bus);
+void snd_hda_bus_reset_codecs(struct hda_bus *bus);
 
 /*
  * power management
 #endif
 
 #ifdef CONFIG_SND_HDA_DSP_LOADER
-static inline int
-snd_hda_codec_load_dsp_prepare(struct hda_codec *codec, unsigned int format,
-                               unsigned int size,
-                               struct snd_dma_buffer *bufp)
-{
-       return codec->bus->ops.load_dsp_prepare(codec->bus, format, size, bufp);
-}
-static inline void
-snd_hda_codec_load_dsp_trigger(struct hda_codec *codec, bool start)
-{
-       return codec->bus->ops.load_dsp_trigger(codec->bus, start);
-}
-static inline void
-snd_hda_codec_load_dsp_cleanup(struct hda_codec *codec,
-                               struct snd_dma_buffer *dmab)
-{
-       return codec->bus->ops.load_dsp_cleanup(codec->bus, dmab);
-}
+int snd_hda_codec_load_dsp_prepare(struct hda_codec *codec, unsigned int format,
+                                  unsigned int size,
+                                  struct snd_dma_buffer *bufp);
+void snd_hda_codec_load_dsp_trigger(struct hda_codec *codec, bool start);
+void snd_hda_codec_load_dsp_cleanup(struct hda_codec *codec,
+                                   struct snd_dma_buffer *dmab);
 #else
 static inline int
 snd_hda_codec_load_dsp_prepare(struct hda_codec *codec, unsigned int format,
 
 
 #define MAX_PREALLOC_SIZE      (32 * 1024 * 1024)
 
-static int azx_attach_pcm_stream(struct hda_bus *_bus, struct hda_codec *codec,
-                                struct hda_pcm *cpcm)
+int snd_hda_attach_pcm_stream(struct hda_bus *_bus, struct hda_codec *codec,
+                             struct hda_pcm *cpcm)
 {
        struct hdac_bus *bus = &_bus->core;
        struct azx *chip = bus_to_azx(bus);
        return NULL;
 }
 
-static int azx_load_dsp_prepare(struct hda_bus *_bus, unsigned int format,
-                               unsigned int byte_size,
-                               struct snd_dma_buffer *bufp)
+int snd_hda_codec_load_dsp_prepare(struct hda_codec *codec, unsigned int format,
+                                  unsigned int byte_size,
+                                  struct snd_dma_buffer *bufp)
 {
-       struct hdac_bus *bus = &_bus->core;
+       struct hdac_bus *bus = &codec->bus->core;
        struct azx *chip = bus_to_azx(bus);
        struct azx_dev *azx_dev;
        struct hdac_stream *hstr;
        azx_dev->prepared = 0;
        return err;
 }
+EXPORT_SYMBOL_GPL(snd_hda_codec_load_dsp_prepare);
 
-static void azx_load_dsp_trigger(struct hda_bus *_bus, bool start)
+void snd_hda_codec_load_dsp_trigger(struct hda_codec *codec, bool start)
 {
-       struct hdac_bus *bus = &_bus->core;
+       struct hdac_bus *bus = &codec->bus->core;
        struct azx *chip = bus_to_azx(bus);
        struct azx_dev *azx_dev = azx_get_dsp_loader_dev(chip);
 
        snd_hdac_dsp_trigger(azx_stream(azx_dev), start);
 }
+EXPORT_SYMBOL_GPL(snd_hda_codec_load_dsp_trigger);
 
-static void azx_load_dsp_cleanup(struct hda_bus *_bus,
-                                struct snd_dma_buffer *dmab)
+void snd_hda_codec_load_dsp_cleanup(struct hda_codec *codec,
+                                   struct snd_dma_buffer *dmab)
 {
-       struct hdac_bus *bus = &_bus->core;
+       struct hdac_bus *bus = &codec->bus->core;
        struct azx *chip = bus_to_azx(bus);
        struct azx_dev *azx_dev = azx_get_dsp_loader_dev(chip);
        struct hdac_stream *hstr = azx_stream(azx_dev);
 
-       if (!dmab->area || !azx_dev->core.locked)
+       if (!dmab->area || !hstr->locked)
                return;
 
        snd_hdac_dsp_cleanup(hstr, dmab);
        hstr->locked = false;
        spin_unlock_irq(&bus->reg_lock);
 }
+EXPORT_SYMBOL_GPL(snd_hda_codec_load_dsp_cleanup);
 #endif /* CONFIG_SND_HDA_DSP_LOADER */
 
 /*
        return 0;
 }
 
-static void azx_bus_reset(struct hda_bus *bus)
+void snd_hda_bus_reset(struct hda_bus *bus)
 {
        struct azx *chip = bus_to_azx(&bus->core);
 
        azx_stop_chip(chip);
        azx_init_chip(chip, true);
        if (bus->core.chip_init)
-               snd_hda_bus_reset(bus);
+               snd_hda_bus_reset_codecs(bus);
        bus->in_reset = 0;
 }
 
        return j;
 }
 
-static struct hda_bus_ops bus_ops = {
-       .attach_pcm = azx_attach_pcm_stream,
-       .bus_reset = azx_bus_reset,
-#ifdef CONFIG_SND_HDA_DSP_LOADER
-       .load_dsp_prepare = azx_load_dsp_prepare,
-       .load_dsp_trigger = azx_load_dsp_trigger,
-       .load_dsp_cleanup = azx_load_dsp_cleanup,
-#endif
-};
-
 /* HD-audio bus initialization */
 int azx_bus_init(struct azx *chip, const char *model,
                 const struct hdac_io_ops *io_ops)
        mutex_init(&bus->prepare_mutex);
        bus->pci = chip->pci;
        bus->modelname = model;
-       bus->ops = bus_ops;
        bus->core.snoop = azx_snoop(chip);
        if (chip->get_position[0] != azx_get_pos_lpib ||
            chip->get_position[1] != azx_get_pos_lpib)