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

Commit 9b6e4c0a authored by Ezequiel Garcia's avatar Ezequiel Garcia Committed by Jason Cooper
Browse files

memory: mvebu-devbus: Remove address decoding window workaround



Now that mbus device tree binding has been introduced, remove the address
decoding window management from this driver.
A suitable 'ranges' entry should be added to the devbus-compatible node in
the device tree, as described by the mbus binding documentation.

Acked-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarEzequiel Garcia <ezequiel.garcia@free-electrons.com>
Tested-by: default avatarAndrew Lunn <andrew@lunn.ch>
Tested-by: default avatarSebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Signed-off-by: default avatarJason Cooper <jason@lakedaemon.net>
parent ad81f054
Loading
Loading
Loading
Loading
+2 −62
Original line number Diff line number Diff line
@@ -208,16 +208,11 @@ static int mvebu_devbus_probe(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
	struct device_node *node = pdev->dev.of_node;
	struct device_node *parent;
	struct devbus *devbus;
	struct resource *res;
	struct clk *clk;
	unsigned long rate;
	const __be32 *ranges;
	int err, cs;
	int addr_cells, p_addr_cells, size_cells;
	int ranges_len, tuple_len;
	u32 base, size;
	int err;

	devbus = devm_kzalloc(&pdev->dev, sizeof(struct devbus), GFP_KERNEL);
	if (!devbus)
@@ -247,69 +242,14 @@ static int mvebu_devbus_probe(struct platform_device *pdev)
	if (err < 0)
		return err;

	/*
	 * Allocate an address window for this device.
	 * If the device probing fails, then we won't be able to
	 * remove the allocated address decoding window.
	 *
	 * FIXME: This is only a temporary hack! We need to do this here
	 * because we still don't have device tree bindings for mbus.
	 * Once that support is added, we will declare these address windows
	 * statically in the device tree, and remove the window configuration
	 * from here.
	 */

	/*
	 * Get the CS to choose the window string.
	 * This is a bit hacky, but it will be removed once the
	 * address windows are declared in the device tree.
	 */
	cs = (((unsigned long)devbus->base) % 0x400) / 8;

	/*
	 * Parse 'ranges' property to obtain a (base,size) window tuple.
	 * This will be removed once the address windows
	 * are declared in the device tree.
	 */
	parent = of_get_parent(node);
	if (!parent)
		return -EINVAL;

	p_addr_cells = of_n_addr_cells(parent);
	of_node_put(parent);

	addr_cells = of_n_addr_cells(node);
	size_cells = of_n_size_cells(node);
	tuple_len = (p_addr_cells + addr_cells + size_cells) * sizeof(__be32);

	ranges = of_get_property(node, "ranges", &ranges_len);
	if (ranges == NULL || ranges_len != tuple_len)
		return -EINVAL;

	base = of_translate_address(node, ranges + addr_cells);
	if (base == OF_BAD_ADDR)
		return -EINVAL;
	size = of_read_number(ranges + addr_cells + p_addr_cells, size_cells);

	/*
	 * Create an mbus address windows.
	 * FIXME: Remove this, together with the above code, once the
	 * address windows are declared in the device tree.
	 */
	err = mvebu_mbus_add_window(devbus_wins[cs], base, size);
	if (err < 0)
		return err;

	/*
	 * We need to create a child device explicitly from here to
	 * guarantee that the child will be probed after the timing
	 * parameters for the bus are written.
	 */
	err = of_platform_populate(node, NULL, NULL, dev);
	if (err < 0) {
		mvebu_mbus_del_window(base, size);
	if (err < 0)
		return err;
	}

	return 0;
}