Commit 7e58accf authored by Roger Quadros's avatar Roger Quadros Committed by Krzysztof Kozlowski

memory: omap-gpmc: Add support for GPMC on AM64 SoC

The TI's AM64 SoC has the GPMC module. Add compatible for it.

Traditionally GPMC external addresses have always been mapped to first
1GB physical address. However newer platforms, can have it mapped
at different locations. Support this address provision via device tree.
Signed-off-by: default avatarRoger Quadros <rogerq@kernel.org>
Link: https://lore.kernel.org/r/20211221131757.2030-3-rogerq@kernel.orgSigned-off-by: default avatarKrzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
parent 48922427
...@@ -237,6 +237,7 @@ struct gpmc_device { ...@@ -237,6 +237,7 @@ struct gpmc_device {
struct omap3_gpmc_regs context; struct omap3_gpmc_regs context;
int nirqs; int nirqs;
unsigned int is_suspended:1; unsigned int is_suspended:1;
struct resource *data;
}; };
static struct irq_domain *gpmc_irq_domain; static struct irq_domain *gpmc_irq_domain;
...@@ -1456,12 +1457,18 @@ static void gpmc_mem_exit(void) ...@@ -1456,12 +1457,18 @@ static void gpmc_mem_exit(void)
} }
} }
static void gpmc_mem_init(void) static void gpmc_mem_init(struct gpmc_device *gpmc)
{ {
int cs; int cs;
if (!gpmc->data) {
/* All legacy devices have same data IO window */
gpmc_mem_root.start = GPMC_MEM_START; gpmc_mem_root.start = GPMC_MEM_START;
gpmc_mem_root.end = GPMC_MEM_END; gpmc_mem_root.end = GPMC_MEM_END;
} else {
gpmc_mem_root.start = gpmc->data->start;
gpmc_mem_root.end = gpmc->data->end;
}
/* Reserve all regions that has been set up by bootloader */ /* Reserve all regions that has been set up by bootloader */
for (cs = 0; cs < gpmc_cs_num; cs++) { for (cs = 0; cs < gpmc_cs_num; cs++) {
...@@ -1888,6 +1895,7 @@ static const struct of_device_id gpmc_dt_ids[] = { ...@@ -1888,6 +1895,7 @@ static const struct of_device_id gpmc_dt_ids[] = {
{ .compatible = "ti,omap3430-gpmc" }, /* omap3430 & omap3630 */ { .compatible = "ti,omap3430-gpmc" }, /* omap3430 & omap3630 */
{ .compatible = "ti,omap4430-gpmc" }, /* omap4430 & omap4460 & omap543x */ { .compatible = "ti,omap4430-gpmc" }, /* omap4430 & omap4460 & omap543x */
{ .compatible = "ti,am3352-gpmc" }, /* am335x devices */ { .compatible = "ti,am3352-gpmc" }, /* am335x devices */
{ .compatible = "ti,am64-gpmc" },
{ } { }
}; };
...@@ -2502,14 +2510,26 @@ static int gpmc_probe(struct platform_device *pdev) ...@@ -2502,14 +2510,26 @@ static int gpmc_probe(struct platform_device *pdev)
gpmc->dev = &pdev->dev; gpmc->dev = &pdev->dev;
platform_set_drvdata(pdev, gpmc); platform_set_drvdata(pdev, gpmc);
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cfg");
if (!res) if (!res) {
return -ENOENT; /* legacy DT */
gpmc_base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(gpmc_base))
return PTR_ERR(gpmc_base);
} else {
gpmc_base = devm_ioremap_resource(&pdev->dev, res); gpmc_base = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(gpmc_base)) if (IS_ERR(gpmc_base))
return PTR_ERR(gpmc_base); return PTR_ERR(gpmc_base);
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "data");
if (!res) {
dev_err(&pdev->dev, "couldn't get data reg resource\n");
return -ENOENT;
}
gpmc->data = res;
}
gpmc->irq = platform_get_irq(pdev, 0); gpmc->irq = platform_get_irq(pdev, 0);
if (gpmc->irq < 0) if (gpmc->irq < 0)
return gpmc->irq; return gpmc->irq;
...@@ -2558,7 +2578,7 @@ static int gpmc_probe(struct platform_device *pdev) ...@@ -2558,7 +2578,7 @@ static int gpmc_probe(struct platform_device *pdev)
dev_info(gpmc->dev, "GPMC revision %d.%d\n", GPMC_REVISION_MAJOR(l), dev_info(gpmc->dev, "GPMC revision %d.%d\n", GPMC_REVISION_MAJOR(l),
GPMC_REVISION_MINOR(l)); GPMC_REVISION_MINOR(l));
gpmc_mem_init(); gpmc_mem_init(gpmc);
rc = gpmc_gpio_init(gpmc); rc = gpmc_gpio_init(gpmc);
if (rc) if (rc)
goto gpio_init_failed; goto gpio_init_failed;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment