Skip to content

Commit

Permalink
memory: mvebu-devbus: Remove address decoding window workaround
Browse files Browse the repository at this point in the history
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: Greg Kroah-Hartman <[email protected]>
Signed-off-by: Ezequiel Garcia <[email protected]>
Tested-by: Andrew Lunn <[email protected]>
Tested-by: Sebastian Hesselbarth <[email protected]>
Signed-off-by: Jason Cooper <[email protected]>
  • Loading branch information
ezequielgarcia authored and Jason Cooper committed Aug 6, 2013
1 parent ad81f05 commit 9b6e4c0
Showing 1 changed file with 2 additions and 62 deletions.
64 changes: 2 additions & 62 deletions drivers/memory/mvebu-devbus.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit 9b6e4c0

Please sign in to comment.