*/
#include <linux/bitops.h>
+#include <linux/cleanup.h>
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/fwnode.h>
};
} eq;
+ /* lock for aliased_addrs and associated registers */
+ struct mutex aliased_addrs_lock;
u16 aliased_addrs[UB960_MAX_PORT_ALIASES];
};
struct device *dev = &priv->client->dev;
unsigned int 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;
struct device *dev = &priv->client->dev;
unsigned int 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] == client->addr)
break;
fwnode_handle_put(rxport->source.ep_fwnode);
fwnode_handle_put(rxport->ser.fwnode);
+ mutex_destroy(&rxport->aliased_addrs_lock);
+
kfree(rxport);
priv->rxports[nport] = NULL;
}
if (ret)
goto err_put_remote_fwnode;
+ mutex_init(&rxport->aliased_addrs_lock);
+
return 0;
err_put_remote_fwnode: