struct hda_codec *codec = device->device_data;
  
        codec->in_freeing = 1;
 -      snd_hdac_device_unregister(&codec->core);
 +      /*
 +       * snd_hda_codec_device_new() is used by legacy HDA and ASoC driver.
 +       * We can't unregister ASoC device since it will be unregistered in
 +       * snd_hdac_ext_bus_device_remove().
 +       */
 +      if (codec->core.type == HDA_DEV_LEGACY)
 +              snd_hdac_device_unregister(&codec->core);
        codec_display_power(codec, false);
-       put_device(hda_codec_dev(codec));
+ 
+       /*
+        * In the case of ASoC HD-audio bus, the device refcount is released in
+        * snd_hdac_ext_bus_device_remove() explicitly.
+        */
+       if (codec->core.type == HDA_DEV_LEGACY)
+               put_device(hda_codec_dev(codec));
+ 
        return 0;
  }