|
@@ -1481,6 +1481,22 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * For some GPMC devices we still need to rely on the bootloader
|
|
|
+ * timings because the devices can be connected via FPGA. So far
|
|
|
+ * the list is smc91x on the omap2 SDP boards, and 8250 on zooms.
|
|
|
+ * REVISIT: Add timing support from slls644g.pdf and from the
|
|
|
+ * lan91c96 manual.
|
|
|
+ */
|
|
|
+ if (of_device_is_compatible(child, "ns16550a") ||
|
|
|
+ of_device_is_compatible(child, "smsc,lan91c94") ||
|
|
|
+ of_device_is_compatible(child, "smsc,lan91c111")) {
|
|
|
+ dev_warn(&pdev->dev,
|
|
|
+ "%s using bootloader timings on CS%d\n",
|
|
|
+ child->name, cs);
|
|
|
+ goto no_timings;
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* FIXME: gpmc_cs_request() will map the CS to an arbitary
|
|
|
* location in the gpmc address space. When booting with
|
|
@@ -1509,6 +1525,7 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
|
|
|
gpmc_read_timings_dt(child, &gpmc_t);
|
|
|
gpmc_cs_set_timings(cs, &gpmc_t);
|
|
|
|
|
|
+no_timings:
|
|
|
if (of_platform_device_create(child, NULL, &pdev->dev))
|
|
|
return 0;
|
|
|
|
|
@@ -1521,42 +1538,6 @@ err:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * REVISIT: Add timing support from slls644g.pdf
|
|
|
- */
|
|
|
-static int gpmc_probe_8250(struct platform_device *pdev,
|
|
|
- struct device_node *child)
|
|
|
-{
|
|
|
- struct resource res;
|
|
|
- unsigned long base;
|
|
|
- int ret, cs;
|
|
|
-
|
|
|
- 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) < 0) {
|
|
|
- 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 (ret < 0) {
|
|
|
- dev_err(&pdev->dev, "cannot request GPMC CS %d\n", cs);
|
|
|
- return ret;
|
|
|
- }
|
|
|
-
|
|
|
- if (of_platform_device_create(child, NULL, &pdev->dev))
|
|
|
- return 0;
|
|
|
-
|
|
|
- dev_err(&pdev->dev, "failed to create gpmc child %s\n", child->name);
|
|
|
-
|
|
|
- return -ENODEV;
|
|
|
-}
|
|
|
-
|
|
|
static int gpmc_probe_dt(struct platform_device *pdev)
|
|
|
{
|
|
|
int ret;
|
|
@@ -1598,10 +1579,9 @@ static int gpmc_probe_dt(struct platform_device *pdev)
|
|
|
else if (of_node_cmp(child->name, "onenand") == 0)
|
|
|
ret = gpmc_probe_onenand_child(pdev, child);
|
|
|
else if (of_node_cmp(child->name, "ethernet") == 0 ||
|
|
|
- of_node_cmp(child->name, "nor") == 0)
|
|
|
+ of_node_cmp(child->name, "nor") == 0 ||
|
|
|
+ of_node_cmp(child->name, "uart") == 0)
|
|
|
ret = gpmc_probe_generic_child(pdev, child);
|
|
|
- else if (of_node_cmp(child->name, "8250") == 0)
|
|
|
- ret = gpmc_probe_8250(pdev, child);
|
|
|
|
|
|
if (WARN(ret < 0, "%s: probing gpmc child %s failed\n",
|
|
|
__func__, child->full_name))
|