Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e4ea40f9 authored by Itai Katz's avatar Itai Katz Committed by Greg Kroah-Hartman
Browse files

staging: fsl-mc: add function to return pointer to root dprc



To support multiple root dprcs, instead of relying on the
dev_root field of the bus type struct, instead create a
function to traverse to the root dprc and return a pointer
to the device struct

Signed-off-by: default avatarItai Katz <itai.katz@freescale.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b55f00c6
Loading
Loading
Loading
Loading
+34 −4
Original line number Diff line number Diff line
@@ -217,12 +217,35 @@ bool fsl_mc_bus_exists(void)
}
EXPORT_SYMBOL_GPL(fsl_mc_bus_exists);

/**
* fsl_mc_get_root_dprc - function to traverse to the root dprc
*/
static void fsl_mc_get_root_dprc(struct device *dev,
				 struct device **root_dprc_dev)
{
	if (WARN_ON(!dev)) {
		*root_dprc_dev = NULL;
	} else if (WARN_ON(dev->bus != &fsl_mc_bus_type)) {
		*root_dprc_dev = NULL;
	} else {
		*root_dprc_dev = dev;
		while ((*root_dprc_dev)->parent->bus == &fsl_mc_bus_type)
			*root_dprc_dev = (*root_dprc_dev)->parent;
	}
}

/**
 * fsl_mc_is_root_dprc - function to check if a given device is a root dprc
 */
static bool fsl_mc_is_root_dprc(struct device *dev)
{
	return dev == fsl_mc_bus_type.dev_root;
	struct device *root_dprc_dev;

	fsl_mc_get_root_dprc(dev, &root_dprc_dev);
	if (!root_dprc_dev)
		return false;
	else
		return dev == root_dprc_dev;
}

static int get_dprc_icid(struct fsl_mc_io *mc_io,
@@ -253,11 +276,18 @@ static int get_dprc_icid(struct fsl_mc_io *mc_io,
	return error;
}

static int translate_mc_addr(enum dprc_region_type mc_region_type,
static int translate_mc_addr(struct fsl_mc_device *mc_dev,
			     enum dprc_region_type mc_region_type,
			     u64 mc_offset, phys_addr_t *phys_addr)
{
	int i;
	struct fsl_mc *mc = dev_get_drvdata(fsl_mc_bus_type.dev_root->parent);
	struct device *root_dprc_dev;
	struct fsl_mc *mc;

	fsl_mc_get_root_dprc(&mc_dev->dev, &root_dprc_dev);
	if (WARN_ON(!root_dprc_dev))
		return -EINVAL;
	mc = dev_get_drvdata(root_dprc_dev->parent);

	if (mc->num_translation_ranges == 0) {
		/*
@@ -328,7 +358,7 @@ static int fsl_mc_device_get_mmio_regions(struct fsl_mc_device *mc_dev,
		}

		WARN_ON(region_desc.size == 0);
		error = translate_mc_addr(mc_region_type,
		error = translate_mc_addr(mc_dev, mc_region_type,
					  region_desc.base_offset,
					  &regions[i].start);
		if (error < 0) {