mirror of
https://github.com/torvalds/linux
synced 2024-10-08 20:34:15 +00:00
of: address: Reshuffle to remove forward declarations
Reshuffle the code to get rid of the forward declarations, which improves readability. Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> Link: https://lore.kernel.org/r/b8701c04d27e51618444a747c4f4be5cc889ce28.1680248888.git.geert+renesas@glider.be Signed-off-by: Rob Herring <robh@kernel.org>
This commit is contained in:
parent
65b6b046e2
commit
5eac0bdc78
|
@ -22,11 +22,6 @@
|
|||
#define OF_CHECK_ADDR_COUNT(na) ((na) > 0 && (na) <= OF_MAX_ADDR_CELLS)
|
||||
#define OF_CHECK_COUNTS(na, ns) (OF_CHECK_ADDR_COUNT(na) && (ns) > 0)
|
||||
|
||||
static struct of_bus *of_match_bus(struct device_node *np);
|
||||
static int __of_address_to_resource(struct device_node *dev, int index,
|
||||
int bar_no, struct resource *r);
|
||||
static bool of_mmio_is_nonposted(struct device_node *np);
|
||||
|
||||
/* Debug utility */
|
||||
#ifdef DEBUG
|
||||
static void of_dump_addr(const char *s, const __be32 *addr, int na)
|
||||
|
@ -195,17 +190,6 @@ static int of_bus_pci_translate(__be32 *addr, u64 offset, int na)
|
|||
}
|
||||
#endif /* CONFIG_PCI */
|
||||
|
||||
int of_pci_address_to_resource(struct device_node *dev, int bar,
|
||||
struct resource *r)
|
||||
{
|
||||
|
||||
if (!IS_ENABLED(CONFIG_PCI))
|
||||
return -ENOSYS;
|
||||
|
||||
return __of_address_to_resource(dev, -1, bar, r);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_pci_address_to_resource);
|
||||
|
||||
/*
|
||||
* of_pci_range_to_resource - Create a resource from an of_pci_range
|
||||
* @range: the PCI range that describes the resource
|
||||
|
@ -834,128 +818,6 @@ static u64 of_translate_ioport(struct device_node *dev, const __be32 *in_addr,
|
|||
return port;
|
||||
}
|
||||
|
||||
static int __of_address_to_resource(struct device_node *dev, int index, int bar_no,
|
||||
struct resource *r)
|
||||
{
|
||||
u64 taddr;
|
||||
const __be32 *addrp;
|
||||
u64 size;
|
||||
unsigned int flags;
|
||||
const char *name = NULL;
|
||||
|
||||
addrp = __of_get_address(dev, index, bar_no, &size, &flags);
|
||||
if (addrp == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
/* Get optional "reg-names" property to add a name to a resource */
|
||||
if (index >= 0)
|
||||
of_property_read_string_index(dev, "reg-names", index, &name);
|
||||
|
||||
if (flags & IORESOURCE_MEM)
|
||||
taddr = of_translate_address(dev, addrp);
|
||||
else if (flags & IORESOURCE_IO)
|
||||
taddr = of_translate_ioport(dev, addrp, size);
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
if (taddr == OF_BAD_ADDR)
|
||||
return -EINVAL;
|
||||
memset(r, 0, sizeof(struct resource));
|
||||
|
||||
if (of_mmio_is_nonposted(dev))
|
||||
flags |= IORESOURCE_MEM_NONPOSTED;
|
||||
|
||||
r->start = taddr;
|
||||
r->end = taddr + size - 1;
|
||||
r->flags = flags;
|
||||
r->name = name ? name : dev->full_name;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* of_address_to_resource - Translate device tree address and return as resource
|
||||
* @dev: Caller's Device Node
|
||||
* @index: Index into the array
|
||||
* @r: Pointer to resource array
|
||||
*
|
||||
* Returns -EINVAL if the range cannot be converted to resource.
|
||||
*
|
||||
* Note that if your address is a PIO address, the conversion will fail if
|
||||
* the physical address can't be internally converted to an IO token with
|
||||
* pci_address_to_pio(), that is because it's either called too early or it
|
||||
* can't be matched to any host bridge IO space
|
||||
*/
|
||||
int of_address_to_resource(struct device_node *dev, int index,
|
||||
struct resource *r)
|
||||
{
|
||||
return __of_address_to_resource(dev, index, -1, r);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_address_to_resource);
|
||||
|
||||
/**
|
||||
* of_iomap - Maps the memory mapped IO for a given device_node
|
||||
* @np: the device whose io range will be mapped
|
||||
* @index: index of the io range
|
||||
*
|
||||
* Returns a pointer to the mapped memory
|
||||
*/
|
||||
void __iomem *of_iomap(struct device_node *np, int index)
|
||||
{
|
||||
struct resource res;
|
||||
|
||||
if (of_address_to_resource(np, index, &res))
|
||||
return NULL;
|
||||
|
||||
if (res.flags & IORESOURCE_MEM_NONPOSTED)
|
||||
return ioremap_np(res.start, resource_size(&res));
|
||||
else
|
||||
return ioremap(res.start, resource_size(&res));
|
||||
}
|
||||
EXPORT_SYMBOL(of_iomap);
|
||||
|
||||
/*
|
||||
* of_io_request_and_map - Requests a resource and maps the memory mapped IO
|
||||
* for a given device_node
|
||||
* @device: the device whose io range will be mapped
|
||||
* @index: index of the io range
|
||||
* @name: name "override" for the memory region request or NULL
|
||||
*
|
||||
* Returns a pointer to the requested and mapped memory or an ERR_PTR() encoded
|
||||
* error code on failure. Usage example:
|
||||
*
|
||||
* base = of_io_request_and_map(node, 0, "foo");
|
||||
* if (IS_ERR(base))
|
||||
* return PTR_ERR(base);
|
||||
*/
|
||||
void __iomem *of_io_request_and_map(struct device_node *np, int index,
|
||||
const char *name)
|
||||
{
|
||||
struct resource res;
|
||||
void __iomem *mem;
|
||||
|
||||
if (of_address_to_resource(np, index, &res))
|
||||
return IOMEM_ERR_PTR(-EINVAL);
|
||||
|
||||
if (!name)
|
||||
name = res.name;
|
||||
if (!request_mem_region(res.start, resource_size(&res), name))
|
||||
return IOMEM_ERR_PTR(-EBUSY);
|
||||
|
||||
if (res.flags & IORESOURCE_MEM_NONPOSTED)
|
||||
mem = ioremap_np(res.start, resource_size(&res));
|
||||
else
|
||||
mem = ioremap(res.start, resource_size(&res));
|
||||
|
||||
if (!mem) {
|
||||
release_mem_region(res.start, resource_size(&res));
|
||||
return IOMEM_ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
return mem;
|
||||
}
|
||||
EXPORT_SYMBOL(of_io_request_and_map);
|
||||
|
||||
#ifdef CONFIG_HAS_DMA
|
||||
/**
|
||||
* of_dma_get_range - Get DMA range info and put it into a map array
|
||||
|
@ -1152,3 +1014,136 @@ static bool of_mmio_is_nonposted(struct device_node *np)
|
|||
of_node_put(parent);
|
||||
return nonposted;
|
||||
}
|
||||
|
||||
static int __of_address_to_resource(struct device_node *dev, int index, int bar_no,
|
||||
struct resource *r)
|
||||
{
|
||||
u64 taddr;
|
||||
const __be32 *addrp;
|
||||
u64 size;
|
||||
unsigned int flags;
|
||||
const char *name = NULL;
|
||||
|
||||
addrp = __of_get_address(dev, index, bar_no, &size, &flags);
|
||||
if (addrp == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
/* Get optional "reg-names" property to add a name to a resource */
|
||||
if (index >= 0)
|
||||
of_property_read_string_index(dev, "reg-names", index, &name);
|
||||
|
||||
if (flags & IORESOURCE_MEM)
|
||||
taddr = of_translate_address(dev, addrp);
|
||||
else if (flags & IORESOURCE_IO)
|
||||
taddr = of_translate_ioport(dev, addrp, size);
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
if (taddr == OF_BAD_ADDR)
|
||||
return -EINVAL;
|
||||
memset(r, 0, sizeof(struct resource));
|
||||
|
||||
if (of_mmio_is_nonposted(dev))
|
||||
flags |= IORESOURCE_MEM_NONPOSTED;
|
||||
|
||||
r->start = taddr;
|
||||
r->end = taddr + size - 1;
|
||||
r->flags = flags;
|
||||
r->name = name ? name : dev->full_name;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* of_address_to_resource - Translate device tree address and return as resource
|
||||
* @dev: Caller's Device Node
|
||||
* @index: Index into the array
|
||||
* @r: Pointer to resource array
|
||||
*
|
||||
* Returns -EINVAL if the range cannot be converted to resource.
|
||||
*
|
||||
* Note that if your address is a PIO address, the conversion will fail if
|
||||
* the physical address can't be internally converted to an IO token with
|
||||
* pci_address_to_pio(), that is because it's either called too early or it
|
||||
* can't be matched to any host bridge IO space
|
||||
*/
|
||||
int of_address_to_resource(struct device_node *dev, int index,
|
||||
struct resource *r)
|
||||
{
|
||||
return __of_address_to_resource(dev, index, -1, r);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_address_to_resource);
|
||||
|
||||
int of_pci_address_to_resource(struct device_node *dev, int bar,
|
||||
struct resource *r)
|
||||
{
|
||||
|
||||
if (!IS_ENABLED(CONFIG_PCI))
|
||||
return -ENOSYS;
|
||||
|
||||
return __of_address_to_resource(dev, -1, bar, r);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_pci_address_to_resource);
|
||||
|
||||
/**
|
||||
* of_iomap - Maps the memory mapped IO for a given device_node
|
||||
* @np: the device whose io range will be mapped
|
||||
* @index: index of the io range
|
||||
*
|
||||
* Returns a pointer to the mapped memory
|
||||
*/
|
||||
void __iomem *of_iomap(struct device_node *np, int index)
|
||||
{
|
||||
struct resource res;
|
||||
|
||||
if (of_address_to_resource(np, index, &res))
|
||||
return NULL;
|
||||
|
||||
if (res.flags & IORESOURCE_MEM_NONPOSTED)
|
||||
return ioremap_np(res.start, resource_size(&res));
|
||||
else
|
||||
return ioremap(res.start, resource_size(&res));
|
||||
}
|
||||
EXPORT_SYMBOL(of_iomap);
|
||||
|
||||
/*
|
||||
* of_io_request_and_map - Requests a resource and maps the memory mapped IO
|
||||
* for a given device_node
|
||||
* @device: the device whose io range will be mapped
|
||||
* @index: index of the io range
|
||||
* @name: name "override" for the memory region request or NULL
|
||||
*
|
||||
* Returns a pointer to the requested and mapped memory or an ERR_PTR() encoded
|
||||
* error code on failure. Usage example:
|
||||
*
|
||||
* base = of_io_request_and_map(node, 0, "foo");
|
||||
* if (IS_ERR(base))
|
||||
* return PTR_ERR(base);
|
||||
*/
|
||||
void __iomem *of_io_request_and_map(struct device_node *np, int index,
|
||||
const char *name)
|
||||
{
|
||||
struct resource res;
|
||||
void __iomem *mem;
|
||||
|
||||
if (of_address_to_resource(np, index, &res))
|
||||
return IOMEM_ERR_PTR(-EINVAL);
|
||||
|
||||
if (!name)
|
||||
name = res.name;
|
||||
if (!request_mem_region(res.start, resource_size(&res), name))
|
||||
return IOMEM_ERR_PTR(-EBUSY);
|
||||
|
||||
if (res.flags & IORESOURCE_MEM_NONPOSTED)
|
||||
mem = ioremap_np(res.start, resource_size(&res));
|
||||
else
|
||||
mem = ioremap(res.start, resource_size(&res));
|
||||
|
||||
if (!mem) {
|
||||
release_mem_region(res.start, resource_size(&res));
|
||||
return IOMEM_ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
return mem;
|
||||
}
|
||||
EXPORT_SYMBOL(of_io_request_and_map);
|
||||
|
|
Loading…
Reference in a new issue