From 703972946a42cf1f83bf50cf389d618d61b69500 Mon Sep 17 00:00:00 2001 From: Bharat Bhushan Date: Mon, 10 Dec 2018 14:42:51 +0530 Subject: [PATCH] bus: fsl-mc: Allocate mc-portal from root dprc container Root dprc container have allocate-able mc-portals which can be allocated by kernel drivers. As per current design mc-portal is allocated from parent dprc container if requesting device is not root-dprc. This works fine if the requesting device is child of root dprc container, because their parent is root-dprc container. But if request device is grandchild of root dprc container then it tries to allocate from it's parent root dprc-container and it fails. Signed-off-by: Ioana Ciornei Signed-off-by: Bharat Bhushan --- drivers/bus/fsl-mc/mc-io.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) --- a/drivers/bus/fsl-mc/mc-io.c +++ b/drivers/bus/fsl-mc/mc-io.c @@ -174,14 +174,16 @@ int __must_check fsl_mc_portal_allocate( int error = -EINVAL; struct fsl_mc_resource *resource = NULL; struct fsl_mc_io *mc_io = NULL; + struct device *root_dprc_dev; - if (mc_dev->flags & FSL_MC_IS_DPRC) { + if (fsl_mc_is_root_dprc(&mc_dev->dev)) { mc_bus_dev = mc_dev; } else { - if (!dev_is_fsl_mc(mc_dev->dev.parent)) - return error; + fsl_mc_get_root_dprc(&mc_dev->dev, &root_dprc_dev); + if (WARN_ON(!root_dprc_dev)) + return -EINVAL; - mc_bus_dev = to_fsl_mc_device(mc_dev->dev.parent); + mc_bus_dev = to_fsl_mc_device(root_dprc_dev); } mc_bus = to_fsl_mc_bus(mc_bus_dev);