mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 20:07:46 +09:00
coresight: Fix loss of connection info when a module is unloaded
[ Upstream commitc45b2835e7] child_fwnode should be a read only property based on the DT or ACPI. If it's cleared on the parent device when a child is unloaded, then when the child is loaded again the connection won't be remade. child_dev should be cleared instead which signifies that the connection should be remade when the child_fwnode registers a new coresight_device. Similarly the reference count shouldn't be decremented as long as the parent device exists. The correct place to drop the reference is in coresight_release_platform_data() which is already done. Reproducible on Juno with the following steps: # load all coresight modules. $ cd /sys/bus/coresight/devices/ $ echo 1 > tmc_etr0/enable_sink $ echo 1 > etm0/enable_source # Works fine ^ $ echo 0 > etm0/enable_source $ rmmod coresight-funnel $ modprobe coresight-funnel $ echo 1 > etm0/enable_source -bash: echo: write error: Invalid argument Fixes:37ea1ffddf("coresight: Use fwnode handle instead of device names") Fixes:2af89ebacf("coresight: Clear the connection field properly") Tested-by: Suzuki K Poulose <suzuki.poulose@arm.com> Reviewed-by: Mike Leach <mike.leach@linaro.org> Signed-off-by: James Clark <james.clark@arm.com> Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com> Link: https://lore.kernel.org/r/20230425143542.2305069-2-james.clark@arm.com Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
018eddcb6b
commit
e52019c095
@@ -1376,13 +1376,8 @@ static int coresight_remove_match(struct device *dev, void *data)
|
|||||||
if (csdev->dev.fwnode == conn->child_fwnode) {
|
if (csdev->dev.fwnode == conn->child_fwnode) {
|
||||||
iterator->orphan = true;
|
iterator->orphan = true;
|
||||||
coresight_remove_links(iterator, conn);
|
coresight_remove_links(iterator, conn);
|
||||||
/*
|
|
||||||
* Drop the reference to the handle for the remote
|
conn->child_dev = NULL;
|
||||||
* device acquired in parsing the connections from
|
|
||||||
* platform data.
|
|
||||||
*/
|
|
||||||
fwnode_handle_put(conn->child_fwnode);
|
|
||||||
conn->child_fwnode = NULL;
|
|
||||||
/* No need to continue */
|
/* No need to continue */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user