struct ub960_rxport *rxport = priv->rxports[chan_id];
        struct device *dev = &priv->client->dev;
        unsigned int reg_idx;
 +      int ret = 0;
  
-       for (reg_idx = 0; reg_idx < ARRAY_SIZE(rxport->aliased_clients); reg_idx++) {
-               if (!rxport->aliased_clients[reg_idx])
+       guard(mutex)(&rxport->aliased_addrs_lock);
+ 
+       for (reg_idx = 0; reg_idx < ARRAY_SIZE(rxport->aliased_addrs); reg_idx++) {
+               if (!rxport->aliased_addrs[reg_idx])
                        break;
        }
  
                return -EADDRNOTAVAIL;
        }
  
-       rxport->aliased_clients[reg_idx] = client;
+       rxport->aliased_addrs[reg_idx] = addr;
  
        ub960_rxport_write(priv, chan_id, UB960_RR_SLAVE_ID(reg_idx),
-                          client->addr << 1, &ret);
 -                         addr << 1);
++                         addr << 1, &ret);
        ub960_rxport_write(priv, chan_id, UB960_RR_SLAVE_ALIAS(reg_idx),
 -                         alias << 1);
 +                         alias << 1, &ret);
 +
 +      if (ret)
 +              return ret;
  
        dev_dbg(dev, "rx%u: client 0x%02x assigned alias 0x%02x at slot %u\n",
-               rxport->nport, client->addr, alias, reg_idx);
+               rxport->nport, addr, alias, reg_idx);
  
        return 0;
  }
        struct ub960_rxport *rxport = priv->rxports[chan_id];
        struct device *dev = &priv->client->dev;
        unsigned int reg_idx;
 +      int ret;
  
-       for (reg_idx = 0; reg_idx < ARRAY_SIZE(rxport->aliased_clients); reg_idx++) {
-               if (rxport->aliased_clients[reg_idx] == client)
+       guard(mutex)(&rxport->aliased_addrs_lock);
+ 
+       for (reg_idx = 0; reg_idx < ARRAY_SIZE(rxport->aliased_addrs); reg_idx++) {
+               if (rxport->aliased_addrs[reg_idx] == addr)
                        break;
        }
  
                return;
        }
  
-       rxport->aliased_clients[reg_idx] = NULL;
+       rxport->aliased_addrs[reg_idx] = 0;
  
 -      ub960_rxport_write(priv, chan_id, UB960_RR_SLAVE_ALIAS(reg_idx), 0);
 +      ret = ub960_rxport_write(priv, chan_id, UB960_RR_SLAVE_ALIAS(reg_idx),
 +                               0, NULL);
 +      if (ret) {
 +              dev_err(dev, "rx%u: unable to fully unmap client 0x%02x: %d\n",
-                       rxport->nport, client->addr, ret);
++                      rxport->nport, addr, ret);
 +              return;
 +      }
  
        dev_dbg(dev, "rx%u: client 0x%02x released at slot %u\n", rxport->nport,
-               client->addr, reg_idx);
+               addr, reg_idx);
  }
  
  static const struct i2c_atr_ops ub960_atr_ops = {
  
  static void ub960_rxport_free_ports(struct ub960_data *priv)
  {
 -      unsigned int nport;
 -
 -      for (nport = 0; nport < priv->hw_data->num_rxports; nport++) {
 -              struct ub960_rxport *rxport = priv->rxports[nport];
 -
 -              if (!rxport)
 -                      continue;
 -
 -              fwnode_handle_put(rxport->source.ep_fwnode);
 -              fwnode_handle_put(rxport->ser.fwnode);
 +      for_each_active_rxport(priv, it) {
 +              fwnode_handle_put(it.rxport->source.ep_fwnode);
 +              fwnode_handle_put(it.rxport->ser.fwnode);
  
 -              mutex_destroy(&rxport->aliased_addrs_lock);
++              mutex_destroy(&it.rxport->aliased_addrs_lock);
+ 
 -              kfree(rxport);
 -              priv->rxports[nport] = NULL;
 +              kfree(it.rxport);
 +              priv->rxports[it.nport] = NULL;
        }
  }