diff options
Diffstat (limited to 'drivers/of/address.c')
-rw-r--r-- | drivers/of/address.c | 39 |
1 files changed, 17 insertions, 22 deletions
diff --git a/drivers/of/address.c b/drivers/of/address.c index 524a0f6a79..03868406e2 100644 --- a/drivers/of/address.c +++ b/drivers/of/address.c @@ -1,18 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-only /* * address.c - address related devicetree functions * * Copyright (c) 2012 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix * * based on Linux devicetree support - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include <common.h> #include <of.h> @@ -133,8 +125,10 @@ static unsigned int of_bus_pci_get_flags(const __be32 *addr) case 0x01: flags |= IORESOURCE_IO; break; - case 0x02: /* 32 bits */ case 0x03: /* 64 bits */ + flags |= IORESOURCE_MEM_64; + /* fallthrough */ + case 0x02: /* 32 bits */ flags |= IORESOURCE_MEM; break; } @@ -307,10 +301,13 @@ static int of_translate_one(struct device_node *parent, struct of_bus *bus, * * As far as we know, this damage only exists on Apple machines, so * This code is only enabled on powerpc. --gcl + * + * This quirk also applies for 'dma-ranges' which frequently exist in + * child nodes without 'dma-ranges' in the parent nodes. --RobH */ ranges = of_get_property(parent, rprop, &rlen); #if !defined(CONFIG_PPC) - if (ranges == NULL) { + if (ranges == NULL && strcmp(rprop, "dma-ranges")) { pr_vdebug("OF: no ranges; cannot translate\n"); return 1; } @@ -365,7 +362,7 @@ static u64 __of_translate_address(struct device_node *dev, int na, ns, pna, pns; u64 result = OF_BAD_ADDR; - pr_vdebug("OF: ** translation for device %s **\n", dev->full_name); + pr_vdebug("OF: ** translation for device %pOF **\n", dev); /* Get parent & match bus type */ parent = of_get_parent(dev); @@ -376,14 +373,13 @@ static u64 __of_translate_address(struct device_node *dev, /* Count address cells & copy address locally */ bus->count_cells(dev, &na, &ns); if (!OF_CHECK_COUNTS(na, ns)) { - pr_vdebug("prom_parse: Bad cell count for %s\n", - dev->full_name); + pr_vdebug("prom_parse: Bad cell count for %pOF\n", dev); return OF_BAD_ADDR; } memcpy(addr, in_addr, na * 4); - pr_vdebug("OF: bus is %s (na=%d, ns=%d) on %s\n", - bus->name, na, ns, parent->full_name); + pr_vdebug("OF: bus is %s (na=%d, ns=%d) on %pOF\n", + bus->name, na, ns, parent); of_dump_addr("OF: translating address:", addr, na); /* Translate */ @@ -403,13 +399,12 @@ static u64 __of_translate_address(struct device_node *dev, pbus = of_match_bus(parent); pbus->count_cells(dev, &pna, &pns); if (!OF_CHECK_COUNTS(pna, pns)) { - printk(KERN_ERR "prom_parse: Bad cell count for %s\n", - dev->full_name); + printk(KERN_ERR "prom_parse: Bad cell count for %pOF\n", dev); break; } - pr_vdebug("OF: parent bus is %s (na=%d, ns=%d) on %s\n", - pbus->name, pna, pns, parent->full_name); + pr_vdebug("OF: parent bus is %s (na=%d, ns=%d) on %pOF\n", + pbus->name, pna, pns, parent); /* Apply bus translation */ if (of_translate_one(dev, bus, pbus, addr, na, ns, pna, rprop)) @@ -676,8 +671,8 @@ int of_dma_get_range(struct device_node *np, u64 *dma_addr, u64 *paddr, u64 *siz dmaaddr = of_read_number(ranges, naddr); *paddr = of_translate_dma_address(node, ranges + naddr); if (*paddr == OF_BAD_ADDR) { - pr_err("translation of DMA address(%llx) to CPU address failed node(%pOF)\n", - dmaaddr, np); + pr_err("translation of DMA address(%llx) to CPU address failed node(%s)\n", + dmaaddr, np->name); ret = -EINVAL; goto out; } |