dais, num_dai);
 }
 
+static void intel_program_sdi(struct sdw_intel *sdw, int dev_num)
+{
+       int ret;
+
+       ret = hdac_bus_eml_sdw_set_lsdiid(sdw->link_res->hbus, sdw->instance, dev_num);
+       if (ret < 0)
+               dev_err(sdw->cdns.dev, "%s: could not set lsdiid for link %d %d\n",
+                       __func__, sdw->instance, dev_num);
+}
+
 const struct sdw_intel_hw_ops sdw_intel_lnl_hw_ops = {
        .debugfs_init = intel_ace2x_debugfs_init,
        .debugfs_exit = intel_ace2x_debugfs_exit,
        .sync_go_unlocked = intel_sync_go_unlocked,
        .sync_go = intel_sync_go,
        .sync_check_cmdsync_unlocked = intel_check_cmdsync_unlocked,
+
+       .program_sdi = intel_program_sdi,
 };
 EXPORT_SYMBOL_NS(sdw_intel_lnl_hw_ops, SOUNDWIRE_INTEL);
 
 
        return sdw->link_res->hw_ops->post_bank_switch(sdw);
 }
 
+static void generic_new_peripheral_assigned(struct sdw_bus *bus, int dev_num)
+{
+       struct sdw_cdns *cdns = bus_to_cdns(bus);
+       struct sdw_intel *sdw = cdns_to_intel(cdns);
+
+       /* paranoia check, this should never happen */
+       if (dev_num < INTEL_DEV_NUM_IDA_MIN || dev_num > SDW_MAX_DEVICES)  {
+               dev_err(bus->dev, "%s: invalid dev_num %d\n", __func__, dev_num);
+               return;
+       }
+
+       if (sdw->link_res->hw_ops->program_sdi)
+               sdw->link_res->hw_ops->program_sdi(sdw, dev_num);
+}
+
 static int sdw_master_read_intel_prop(struct sdw_bus *bus)
 {
        struct sdw_master_prop *prop = &bus->prop;
        .pre_bank_switch = generic_pre_bank_switch,
        .post_bank_switch = generic_post_bank_switch,
        .read_ping_status = cdns_read_ping_status,
+       .new_peripheral_assigned = generic_new_peripheral_assigned,
 };
 
 /*
 
  * @sync_go: helper for multi-link synchronization
  * @sync_check_cmdsync_unlocked: helper for multi-link synchronization
  * and bank switch - shim_lock is assumed to be locked at higher level
+ * @program_sdi: helper for codec command/control based on dev_num
  */
 struct sdw_intel_hw_ops {
        void (*debugfs_init)(struct sdw_intel *sdw);
        int (*sync_go_unlocked)(struct sdw_intel *sdw);
        int (*sync_go)(struct sdw_intel *sdw);
        bool (*sync_check_cmdsync_unlocked)(struct sdw_intel *sdw);
+
+       void (*program_sdi)(struct sdw_intel *sdw, int dev_num);
 };
 
 extern const struct sdw_intel_hw_ops sdw_intel_cnl_hw_ops;