Commit a5fef9ba authored by Charles Keepax's avatar Charles Keepax Committed by Vinod Koul
Browse files

soundwire: bus: Move irq mapping cleanup into devres



Currently the IRQ mapping is disposed off in sdw_drv_remove(), however
if the SoundWire device uses devres this can run before the actual device
clean up, potentially clearing the mapping whilst it is still in use.
Make this devres safe by also moving the sdw_irq_dispose_mapping into
devres.

Signed-off-by: default avatarCharles Keepax <ckeepax@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20241205113315.2266313-1-ckeepax@opensource.cirrus.com


Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent 40384c84
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -167,9 +167,6 @@ static int sdw_drv_remove(struct device *dev)

	slave->probed = false;

	if (slave->prop.use_domain_irq)
		sdw_irq_dispose_mapping(slave);

	mutex_unlock(&slave->sdw_dev_lock);

	if (drv->remove)
+8 −4
Original line number Diff line number Diff line
@@ -46,14 +46,18 @@ void sdw_irq_delete(struct sdw_bus *bus)
	irq_domain_remove(bus->domain);
}

static void sdw_irq_dispose_mapping(void *data)
{
	struct sdw_slave *slave = data;

	irq_dispose_mapping(irq_find_mapping(slave->bus->domain, slave->dev_num));
}

void sdw_irq_create_mapping(struct sdw_slave *slave)
{
	slave->irq = irq_create_mapping(slave->bus->domain, slave->dev_num);
	if (!slave->irq)
		dev_warn(&slave->dev, "Failed to map IRQ\n");
}

void sdw_irq_dispose_mapping(struct sdw_slave *slave)
{
	irq_dispose_mapping(irq_find_mapping(slave->bus->domain, slave->dev_num));
	devm_add_action_or_reset(&slave->dev, sdw_irq_dispose_mapping, slave);
}
+0 −5
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@ int sdw_irq_create(struct sdw_bus *bus,
		   struct fwnode_handle *fwnode);
void sdw_irq_delete(struct sdw_bus *bus);
void sdw_irq_create_mapping(struct sdw_slave *slave);
void sdw_irq_dispose_mapping(struct sdw_slave *slave);

#else /* CONFIG_IRQ_DOMAIN */

@@ -34,10 +33,6 @@ static inline void sdw_irq_create_mapping(struct sdw_slave *slave)
{
}

static inline void sdw_irq_dispose_mapping(struct sdw_slave *slave)
{
}

#endif /* CONFIG_IRQ_DOMAIN */

#endif /* __SDW_IRQ_H */