Besides being used to interface with external memory devices, the General-Purpose Memory Controller can be used to connect Pseudo-SRAM devices such as ethernet controllers to OMAP2+ processors using the GPMC as a data bus. The actual mapping between the GPMC address space and OMAP2+ address space is made using the GPMC DT "ranges" property. But also a explicit call to gpmc_cs_request() is needed. So, this patch allows an ethernet chip to be defined as an GPMC child node an its chip-select memory address be requested. Signed-off-by: Javier Martinez Canillas <javier.martinez@xxxxxxxxxxxxxxx> --- Jon, This patch assumes that we have solved somehow the issue that a call to request_irq() is needed before before using a GPIO as an IRQ and this is no longer the case when using from Device Trees. Anyway, this is independent as how we solve this, whether is using Jan's patch [1], adding a .request function pointer to irq_chip as suggested by Stephen [2], or any other approach. [1]: https://patchwork.kernel.org/patch/2009331/ [2]: http://www.mail-archive.com/linux-omap@xxxxxxxxxxxxxxx/msg85592.html arch/arm/mach-omap2/gpmc.c | 45 ++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 45 insertions(+), 0 deletions(-) diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index 4fe9ee7..d1bf48b 100644 --- a/arch/arm/mach-omap2/gpmc.c +++ b/arch/arm/mach-omap2/gpmc.c @@ -29,6 +29,7 @@ #include <linux/of.h> #include <linux/of_mtd.h> #include <linux/of_device.h> +#include <linux/of_address.h> #include <linux/mtd/nand.h> #include <linux/platform_data/mtd-nand-omap2.h> @@ -1296,6 +1297,42 @@ static int gpmc_probe_onenand_child(struct platform_device *pdev, } #endif +static int gpmc_probe_ethernet_child(struct platform_device *pdev, + struct device_node *child) +{ + int ret, cs; + unsigned long base; + struct resource res; + struct platform_device *of_dev; + + if (of_property_read_u32(child, "reg", &cs) < 0) { + dev_err(&pdev->dev, "%s has no 'reg' property\n", + child->full_name); + return -ENODEV; + } + + if (of_address_to_resource(child, 0, &res)) { + dev_err(&pdev->dev, "%s has malformed 'reg' property\n", + child->full_name); + return -ENODEV; + } + + ret = gpmc_cs_request(cs, resource_size(&res), &base); + if (IS_ERR_VALUE(ret)) { + dev_err(&pdev->dev, "cannot request GPMC CS %d\n", cs); + return ret; + } + + of_dev = of_platform_device_create(child, NULL, &pdev->dev); + if (!of_dev) { + dev_err(&pdev->dev, "cannot create platform device for %s\n", + child->full_name); + return -ENODEV; + } + + return 0; +} + static int gpmc_probe_dt(struct platform_device *pdev) { int ret; @@ -1326,6 +1363,14 @@ static int gpmc_probe_dt(struct platform_device *pdev) return ret; } } + + for_each_node_by_name(child, "ethernet") { + ret = gpmc_probe_ethernet_child(pdev, child); + if (ret < 0) { + of_node_put(child); + return ret; + } + } return 0; } #else -- 1.7.7.6 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html