.scdc = gm200_sor_hdmi_scdc,
        },
        .dp = &ga102_sor_dp,
-       .hda = {
-               .hpd = gf119_sor_hda_hpd,
-               .eld = gf119_sor_hda_eld,
-               .device_entry = gv100_sor_hda_device_entry,
-       },
+       .hda = &gv100_sor_hda,
 };
 
 static int
 
 
 #include <nvif/class.h>
 
-void
+static void
 gf119_sor_hda_device_entry(struct nvkm_ior *ior, int head)
 {
        struct nvkm_device *device = ior->disp->engine.subdev.device;
        u32 mask = 0x80000001;
 
        if (present) {
-               ior->func->hda.device_entry(ior, head);
+               ior->func->hda->device_entry(ior, head);
                data |= 0x00000001;
        } else {
                mask |= 0x00000002;
        nvkm_mask(device, 0x10ec10 + soff, mask, data);
 }
 
+const struct nvkm_ior_func_hda
+gf119_sor_hda = {
+       .hpd = gf119_sor_hda_hpd,
+       .eld = gf119_sor_hda_eld,
+       .device_entry = gf119_sor_hda_device_entry,
+};
+
 void
 gf119_sor_dp_watermark(struct nvkm_ior *sor, int head, u8 watermark)
 {
                .ctrl = gf119_sor_hdmi_ctrl,
        },
        .dp = &gf119_sor_dp,
-       .hda = {
-               .hpd = gf119_sor_hda_hpd,
-               .eld = gf119_sor_hda_eld,
-               .device_entry = gf119_sor_hda_device_entry,
-       },
+       .hda = &gf119_sor_hda,
 };
 
 static int
 
                .ctrl = gk104_sor_hdmi_ctrl,
        },
        .dp = &gf119_sor_dp,
-       .hda = {
-               .hpd = gf119_sor_hda_hpd,
-               .eld = gf119_sor_hda_eld,
-               .device_entry = gf119_sor_hda_device_entry,
-       },
+       .hda = &gf119_sor_hda,
 };
 
 int
 
                .ctrl = gk104_sor_hdmi_ctrl,
        },
        .dp = &gm107_sor_dp,
-       .hda = {
-               .hpd = gf119_sor_hda_hpd,
-               .eld = gf119_sor_hda_eld,
-               .device_entry = gf119_sor_hda_device_entry,
-       },
+       .hda = &gf119_sor_hda,
 };
 
 static int
 
                .scdc = gm200_sor_hdmi_scdc,
        },
        .dp = &gm200_sor_dp,
-       .hda = {
-               .hpd = gf119_sor_hda_hpd,
-               .eld = gf119_sor_hda_eld,
-               .device_entry = gf119_sor_hda_device_entry,
-       },
+       .hda = &gf119_sor_hda,
 };
 
 static int
 
                .scdc = gm200_sor_hdmi_scdc,
        },
        .dp = &gm200_sor_dp,
-       .hda = {
-               .hpd = gf119_sor_hda_hpd,
-               .eld = gf119_sor_hda_eld,
-               .device_entry = gf119_sor_hda_device_entry,
-       },
+       .hda = &gf119_sor_hda,
 };
 
 int
 
 
 #include <nvif/class.h>
 
-void
+static void
 gt215_sor_hda_eld(struct nvkm_ior *ior, int head, u8 *data, u8 size)
 {
        struct nvkm_device *device = ior->disp->engine.subdev.device;
        nvkm_mask(device, 0x61c448 + soff, 0x80000002, 0x80000002);
 }
 
-void
+static void
 gt215_sor_hda_hpd(struct nvkm_ior *ior, int head, bool present)
 {
        struct nvkm_device *device = ior->disp->engine.subdev.device;
        nvkm_mask(device, 0x61c448 + ior->id * 0x800, mask, data);
 }
 
+const struct nvkm_ior_func_hda
+gt215_sor_hda = {
+       .hpd = gt215_sor_hda_hpd,
+       .eld = gt215_sor_hda_eld,
+};
+
 void
 gt215_sor_dp_audio(struct nvkm_ior *sor, int head, bool enable)
 {
                .ctrl = gt215_sor_hdmi_ctrl,
        },
        .dp = >215_sor_dp,
-       .hda = {
-               .hpd = gt215_sor_hda_hpd,
-               .eld = gt215_sor_hda_eld,
-       },
+       .hda = >215_sor_hda,
 };
 
 static int
 
 #include <nvif/clc37e.h>
 #include <nvif/unpack.h>
 
-void
+static void
 gv100_sor_hda_device_entry(struct nvkm_ior *ior, int head)
 {
        struct nvkm_device *device = ior->disp->engine.subdev.device;
        nvkm_mask(device, 0x616528 + hoff, 0x00000070, head << 4);
 }
 
+const struct nvkm_ior_func_hda
+gv100_sor_hda = {
+       .hpd = gf119_sor_hda_hpd,
+       .eld = gf119_sor_hda_eld,
+       .device_entry = gv100_sor_hda_device_entry,
+};
+
 void
 gv100_sor_dp_watermark(struct nvkm_ior *sor, int head, u8 watermark)
 {
                .scdc = gm200_sor_hdmi_scdc,
        },
        .dp = &gv100_sor_dp,
-       .hda = {
-               .hpd = gf119_sor_hda_hpd,
-               .eld = gf119_sor_hda_eld,
-               .device_entry = gv100_sor_hda_device_entry,
-       },
+       .hda = &gv100_sor_hda,
 };
 
 static int
 
                void (*watermark)(struct nvkm_ior *, int head, u8 watermark);
        } *dp;
 
-       struct {
+       const struct nvkm_ior_func_hda {
                void (*hpd)(struct nvkm_ior *, int head, bool present);
                void (*eld)(struct nvkm_ior *, int head, u8 *data, u8 size);
                void (*device_entry)(struct nvkm_ior *, int head);
-       } hda;
+       } *hda;
 };
 
 int nvkm_ior_new_(const struct nvkm_ior_func *func, struct nvkm_disp *,
 
 void gt215_sor_hdmi_ctrl(struct nvkm_ior *, int, bool, u8, u8, u8 *, u8 , u8 *, u8);
 void gt215_sor_dp_audio(struct nvkm_ior *, int, bool);
-void gt215_sor_hda_hpd(struct nvkm_ior *, int, bool);
-void gt215_sor_hda_eld(struct nvkm_ior *, int, u8 *, u8);
+extern const struct nvkm_ior_func_hda gt215_sor_hda;
 
 int gf119_sor_cnt(struct nvkm_disp *, unsigned long *);
 void gf119_sor_state(struct nvkm_ior *, struct nvkm_ior_state *);
 void gf119_sor_dp_audio(struct nvkm_ior *, int, bool);
 void gf119_sor_dp_audio_sym(struct nvkm_ior *, int, u16, u32);
 void gf119_sor_dp_watermark(struct nvkm_ior *, int, u8);
+extern const struct nvkm_ior_func_hda gf119_sor_hda;
 void gf119_sor_hda_hpd(struct nvkm_ior *, int, bool);
 void gf119_sor_hda_eld(struct nvkm_ior *, int, u8 *, u8);
-void gf119_sor_hda_device_entry(struct nvkm_ior *, int);
 
 int gk104_sor_new(struct nvkm_disp *, int);
 void gk104_sor_hdmi_ctrl(struct nvkm_ior *, int, bool, u8, u8, u8 *, u8 , u8 *, u8);
 void gv100_sor_dp_audio(struct nvkm_ior *, int, bool);
 void gv100_sor_dp_audio_sym(struct nvkm_ior *, int, u16, u32);
 void gv100_sor_dp_watermark(struct nvkm_ior *, int, u8);
-void gv100_sor_hda_device_entry(struct nvkm_ior *, int);
+extern const struct nvkm_ior_func_hda gv100_sor_hda;
 
 void tu102_sor_dp_vcpi(struct nvkm_ior *, int, u8, u8, u16, u16);
 
 
                .ctrl = gt215_sor_hdmi_ctrl,
        },
        .dp = &mcp89_sor_dp,
-       .hda = {
-               .hpd = gt215_sor_hda_hpd,
-               .eld = gt215_sor_hda_eld,
-       },
+       .hda = >215_sor_hda,
 };
 
 static int
 
                } else
                        return ret;
 
-               if (!ior->func->hda.hpd)
+               if (!ior->hda)
                        return -ENODEV;
 
                if (size && args->v0.data[0]) {
                        if (outp->info.type == DCB_OUTPUT_DP)
                                ior->func->dp->audio(ior, hidx, true);
-                       ior->func->hda.hpd(ior, hidx, true);
-                       ior->func->hda.eld(ior, hidx, data, size);
+                       ior->func->hda->hpd(ior, hidx, true);
+                       ior->func->hda->eld(ior, hidx, data, size);
                } else {
                        if (outp->info.type == DCB_OUTPUT_DP)
                                ior->func->dp->audio(ior, hidx, false);
-                       ior->func->hda.hpd(ior, hidx, false);
+                       ior->func->hda->hpd(ior, hidx, false);
                }
 
                return 0;
 
                .scdc = gm200_sor_hdmi_scdc,
        },
        .dp = &tu102_sor_dp,
-       .hda = {
-               .hpd = gf119_sor_hda_hpd,
-               .eld = gf119_sor_hda_eld,
-               .device_entry = gv100_sor_hda_device_entry,
-       },
+       .hda = &gv100_sor_hda,
 };
 
 static int