mirror of https://gitee.com/openkylin/linux.git
ARM: OMAP2+: Fix GPMC and simplify bootloader timings for 8250 and smc91x
Commit f2bf0e72d0
(ARM: OMAP2+: Add minimal 8250 support
for GPMC) added support for using bootloader timings for some
devices. Turns out we can do the same by looking at the compatible
flags of the child without adding a new function as smc91x has
a similar issue as 8250 with the bootloader timings.
And let's fix the 8250 naming, we should use the device type as
the name like uart instead of 8250 for zoom dts file.
Cc: "Benoît Cousson" <bcousson@baylibre.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
This commit is contained in:
parent
4c624840eb
commit
fd4446f25e
|
@ -13,7 +13,7 @@ &gpmc {
|
||||||
* they probably share the same GPIO IRQ
|
* they probably share the same GPIO IRQ
|
||||||
* REVISIT: Add timing support from slls644g.pdf
|
* REVISIT: Add timing support from slls644g.pdf
|
||||||
*/
|
*/
|
||||||
8250@3,0 {
|
uart@3,0 {
|
||||||
compatible = "ns16550a";
|
compatible = "ns16550a";
|
||||||
reg = <3 0 0x100>;
|
reg = <3 0 0x100>;
|
||||||
bank-width = <2>;
|
bank-width = <2>;
|
||||||
|
|
|
@ -1481,6 +1481,22 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
|
||||||
return ret;
|
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
|
* FIXME: gpmc_cs_request() will map the CS to an arbitary
|
||||||
* location in the gpmc address space. When booting with
|
* 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_read_timings_dt(child, &gpmc_t);
|
||||||
gpmc_cs_set_timings(cs, &gpmc_t);
|
gpmc_cs_set_timings(cs, &gpmc_t);
|
||||||
|
|
||||||
|
no_timings:
|
||||||
if (of_platform_device_create(child, NULL, &pdev->dev))
|
if (of_platform_device_create(child, NULL, &pdev->dev))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -1521,42 +1538,6 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
|
||||||
return ret;
|
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)
|
static int gpmc_probe_dt(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -1598,10 +1579,9 @@ static int gpmc_probe_dt(struct platform_device *pdev)
|
||||||
else if (of_node_cmp(child->name, "onenand") == 0)
|
else if (of_node_cmp(child->name, "onenand") == 0)
|
||||||
ret = gpmc_probe_onenand_child(pdev, child);
|
ret = gpmc_probe_onenand_child(pdev, child);
|
||||||
else if (of_node_cmp(child->name, "ethernet") == 0 ||
|
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);
|
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",
|
if (WARN(ret < 0, "%s: probing gpmc child %s failed\n",
|
||||||
__func__, child->full_name))
|
__func__, child->full_name))
|
||||||
|
|
Loading…
Reference in New Issue