Commit 51f00a47 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'next-devicetree' of git://git.secretlab.ca/git/linux-2.6

* 'next-devicetree' of git://git.secretlab.ca/git/linux-2.6:
  mtd/m25p80: add support to parse the partitions by OF node
  of/irq: of_irq.c needs to include linux/irq.h
  of/mips: Cleanup some include directives/files.
  of/mips: Add device tree support to MIPS
  of/flattree: Eliminate need to provide early_init_dt_scan_chosen_arch
  of/device: Rework to use common platform_device_alloc() for allocating devices
  of/xsysace: Fix OF probing on little-endian systems
  of: use __be32 types for big-endian device tree data
  of/irq: remove references to NO_IRQ in drivers/of/platform.c
  of/promtree: add package-to-path support to pdt
  of/promtree: add of_pdt namespace to pdt code
  of/promtree: no longer call prom_ functions directly; use an ops structure
  of/promtree: make drivers/of/pdt.c no longer sparc-only
  sparc: break out some PROM device-tree building code out into drivers/of
  of/sparc: convert various prom_* functions to use phandle
  sparc: stop exporting openprom.h header
  powerpc, of_serial: Endianness issues setting up the serial ports
  of: MTD: Fix OF probing on little-endian systems
  of: GPIO: Fix OF probing on little-endian systems
parents a7f505c6 97ff46cb
...@@ -42,11 +42,6 @@ ...@@ -42,11 +42,6 @@
#include <asm/sections.h> #include <asm/sections.h>
#include <asm/pci-bridge.h> #include <asm/pci-bridge.h>
void __init early_init_dt_scan_chosen_arch(unsigned long node)
{
/* No Microblaze specific code here */
}
void __init early_init_dt_add_memory_arch(u64 base, u64 size) void __init early_init_dt_add_memory_arch(u64 base, u64 size)
{ {
memblock_add(base, size); memblock_add(base, size);
......
...@@ -2128,6 +2128,13 @@ config SECCOMP ...@@ -2128,6 +2128,13 @@ config SECCOMP
If unsure, say Y. Only embedded should say N here. If unsure, say Y. Only embedded should say N here.
config USE_OF
bool "Flattened Device Tree support"
select OF
select OF_FLATTREE
help
Include support for flattened device tree machine descriptions.
endmenu endmenu
config LOCKDEP_SUPPORT config LOCKDEP_SUPPORT
......
...@@ -16,6 +16,11 @@ ...@@ -16,6 +16,11 @@
#include <irq.h> #include <irq.h>
static inline void irq_dispose_mapping(unsigned int virq)
{
return;
}
#ifdef CONFIG_I8259 #ifdef CONFIG_I8259
static inline int irq_canonicalize(int irq) static inline int irq_canonicalize(int irq)
{ {
......
/*
* arch/mips/include/asm/prom.h
*
* Copyright (C) 2010 Cisco Systems Inc. <dediao@cisco.com>
*
* 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.
*
*/
#ifndef __ASM_MIPS_PROM_H
#define __ASM_MIPS_PROM_H
#ifdef CONFIG_OF
#include <asm/bootinfo.h>
/* which is compatible with the flattened device tree (FDT) */
#define cmd_line arcs_cmdline
extern int early_init_dt_scan_memory_arch(unsigned long node,
const char *uname, int depth, void *data);
extern int reserve_mem_mach(unsigned long addr, unsigned long size);
extern void free_mem_mach(unsigned long addr, unsigned long size);
extern void device_tree_init(void);
#else /* CONFIG_OF */
static inline void device_tree_init(void) { }
#endif /* CONFIG_OF */
#endif /* _ASM_MIPS_PROM_H */
...@@ -96,6 +96,8 @@ obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o ...@@ -96,6 +96,8 @@ obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
obj-$(CONFIG_SPINLOCK_TEST) += spinlock_test.o obj-$(CONFIG_SPINLOCK_TEST) += spinlock_test.o
obj-$(CONFIG_OF) += prom.o
CFLAGS_cpu-bugs64.o = $(shell if $(CC) $(KBUILD_CFLAGS) -Wa,-mdaddi -c -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-DHAVE_AS_SET_DADDI"; fi) CFLAGS_cpu-bugs64.o = $(shell if $(CC) $(KBUILD_CFLAGS) -Wa,-mdaddi -c -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-DHAVE_AS_SET_DADDI"; fi)
obj-$(CONFIG_HAVE_STD_PC_SERIAL_PORT) += 8250-platform.o obj-$(CONFIG_HAVE_STD_PC_SERIAL_PORT) += 8250-platform.o
......
/*
* MIPS support for CONFIG_OF device tree support
*
* Copyright (C) 2010 Cisco Systems Inc. <dediao@cisco.com>
*
* 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.
*/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/bootmem.h>
#include <linux/initrd.h>
#include <linux/debugfs.h>
#include <linux/of.h>
#include <linux/of_fdt.h>
#include <linux/of_irq.h>
#include <linux/of_platform.h>
#include <asm/page.h>
#include <asm/prom.h>
int __init early_init_dt_scan_memory_arch(unsigned long node,
const char *uname, int depth,
void *data)
{
return early_init_dt_scan_memory(node, uname, depth, data);
}
void __init early_init_dt_add_memory_arch(u64 base, u64 size)
{
return add_memory_region(base, size, BOOT_MEM_RAM);
}
int __init reserve_mem_mach(unsigned long addr, unsigned long size)
{
return reserve_bootmem(addr, size, BOOTMEM_DEFAULT);
}
void __init free_mem_mach(unsigned long addr, unsigned long size)
{
return free_bootmem(addr, size);
}
u64 __init early_init_dt_alloc_memory_arch(u64 size, u64 align)
{
return virt_to_phys(
__alloc_bootmem(size, align, __pa(MAX_DMA_ADDRESS))
);
}
#ifdef CONFIG_BLK_DEV_INITRD
void __init early_init_dt_setup_initrd_arch(unsigned long start,
unsigned long end)
{
initrd_start = (unsigned long)__va(start);
initrd_end = (unsigned long)__va(end);
initrd_below_start_ok = 1;
}
#endif
/*
* irq_create_of_mapping - Hook to resolve OF irq specifier into a Linux irq#
*
* Currently the mapping mechanism is trivial; simple flat hwirq numbers are
* mapped 1:1 onto Linux irq numbers. Cascaded irq controllers are not
* supported.
*/
unsigned int irq_create_of_mapping(struct device_node *controller,
const u32 *intspec, unsigned int intsize)
{
return intspec[0];
}
EXPORT_SYMBOL_GPL(irq_create_of_mapping);
void __init early_init_devtree(void *params)
{
/* Setup flat device-tree pointer */
initial_boot_params = params;
/* Retrieve various informations from the /chosen node of the
* device-tree, including the platform type, initrd location and
* size, and more ...
*/
of_scan_flat_dt(early_init_dt_scan_chosen, NULL);
/* Scan memory nodes */
of_scan_flat_dt(early_init_dt_scan_root, NULL);
of_scan_flat_dt(early_init_dt_scan_memory_arch, NULL);
}
void __init device_tree_init(void)
{
unsigned long base, size;
if (!initial_boot_params)
return;
base = virt_to_phys((void *)initial_boot_params);
size = initial_boot_params->totalsize;
/* Before we do anything, lets reserve the dt blob */
reserve_mem_mach(base, size);
unflatten_device_tree();
/* free the space reserved for the dt blob */
free_mem_mach(base, size);
}
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/smp-ops.h> #include <asm/smp-ops.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/prom.h>
struct cpuinfo_mips cpu_data[NR_CPUS] __read_mostly; struct cpuinfo_mips cpu_data[NR_CPUS] __read_mostly;
...@@ -487,6 +488,7 @@ static void __init arch_mem_init(char **cmdline_p) ...@@ -487,6 +488,7 @@ static void __init arch_mem_init(char **cmdline_p)
} }
bootmem_init(); bootmem_init();
device_tree_init();
sparse_init(); sparse_init();
paging_init(); paging_init();
} }
......
...@@ -162,13 +162,10 @@ static int ibmebus_create_device(struct device_node *dn) ...@@ -162,13 +162,10 @@ static int ibmebus_create_device(struct device_node *dn)
dev->dev.bus = &ibmebus_bus_type; dev->dev.bus = &ibmebus_bus_type;
dev->dev.archdata.dma_ops = &ibmebus_dma_ops; dev->dev.archdata.dma_ops = &ibmebus_dma_ops;
ret = of_device_register(dev); ret = of_device_add(dev);
if (ret) { if (ret)
of_device_free(dev); platform_device_put(dev);
return ret; return ret;
}
return 0;
} }
static int ibmebus_create_devices(const struct of_device_id *matches) static int ibmebus_create_devices(const struct of_device_id *matches)
......
...@@ -52,14 +52,14 @@ static int __init add_legacy_port(struct device_node *np, int want_index, ...@@ -52,14 +52,14 @@ static int __init add_legacy_port(struct device_node *np, int want_index,
phys_addr_t taddr, unsigned long irq, phys_addr_t taddr, unsigned long irq,
upf_t flags, int irq_check_parent) upf_t flags, int irq_check_parent)
{ {
const u32 *clk, *spd; const __be32 *clk, *spd;
u32 clock = BASE_BAUD * 16; u32 clock = BASE_BAUD * 16;
int index; int index;
/* get clock freq. if present */ /* get clock freq. if present */
clk = of_get_property(np, "clock-frequency", NULL); clk = of_get_property(np, "clock-frequency", NULL);
if (clk && *clk) if (clk && *clk)
clock = *clk; clock = be32_to_cpup(clk);
/* get default speed if present */ /* get default speed if present */
spd = of_get_property(np, "current-speed", NULL); spd = of_get_property(np, "current-speed", NULL);
...@@ -109,7 +109,7 @@ static int __init add_legacy_port(struct device_node *np, int want_index, ...@@ -109,7 +109,7 @@ static int __init add_legacy_port(struct device_node *np, int want_index,
legacy_serial_infos[index].taddr = taddr; legacy_serial_infos[index].taddr = taddr;
legacy_serial_infos[index].np = of_node_get(np); legacy_serial_infos[index].np = of_node_get(np);
legacy_serial_infos[index].clock = clock; legacy_serial_infos[index].clock = clock;
legacy_serial_infos[index].speed = spd ? *spd : 0; legacy_serial_infos[index].speed = spd ? be32_to_cpup(spd) : 0;
legacy_serial_infos[index].irq_check_parent = irq_check_parent; legacy_serial_infos[index].irq_check_parent = irq_check_parent;
printk(KERN_DEBUG "Found legacy serial port %d for %s\n", printk(KERN_DEBUG "Found legacy serial port %d for %s\n",
...@@ -168,7 +168,7 @@ static int __init add_legacy_soc_port(struct device_node *np, ...@@ -168,7 +168,7 @@ static int __init add_legacy_soc_port(struct device_node *np,
static int __init add_legacy_isa_port(struct device_node *np, static int __init add_legacy_isa_port(struct device_node *np,
struct device_node *isa_brg) struct device_node *isa_brg)
{ {
const u32 *reg; const __be32 *reg;
const char *typep; const char *typep;
int index = -1; int index = -1;
u64 taddr; u64 taddr;
...@@ -181,7 +181,7 @@ static int __init add_legacy_isa_port(struct device_node *np, ...@@ -181,7 +181,7 @@ static int __init add_legacy_isa_port(struct device_node *np,
return -1; return -1;
/* Verify it's an IO port, we don't support anything else */ /* Verify it's an IO port, we don't support anything else */
if (!(reg[0] & 0x00000001)) if (!(be32_to_cpu(reg[0]) & 0x00000001))
return -1; return -1;
/* Now look for an "ibm,aix-loc" property that gives us ordering /* Now look for an "ibm,aix-loc" property that gives us ordering
...@@ -202,7 +202,7 @@ static int __init add_legacy_isa_port(struct device_node *np, ...@@ -202,7 +202,7 @@ static int __init add_legacy_isa_port(struct device_node *np,
taddr = 0; taddr = 0;
/* Add port, irq will be dealt with later */ /* Add port, irq will be dealt with later */
return add_legacy_port(np, index, UPIO_PORT, reg[1], taddr, return add_legacy_port(np, index, UPIO_PORT, be32_to_cpu(reg[1]), taddr,
NO_IRQ, UPF_BOOT_AUTOCONF, 0); NO_IRQ, UPF_BOOT_AUTOCONF, 0);
} }
...@@ -251,9 +251,9 @@ static int __init add_legacy_pci_port(struct device_node *np, ...@@ -251,9 +251,9 @@ static int __init add_legacy_pci_port(struct device_node *np,
* we get to their "reg" property * we get to their "reg" property
*/ */
if (np != pci_dev) { if (np != pci_dev) {
const u32 *reg = of_get_property(np, "reg", NULL); const __be32 *reg = of_get_property(np, "reg", NULL);
if (reg && (*reg < 4)) if (reg && (be32_to_cpup(reg) < 4))
index = lindex = *reg; index = lindex = be32_to_cpup(reg);
} }
/* Local index means it's the Nth port in the PCI chip. Unfortunately /* Local index means it's the Nth port in the PCI chip. Unfortunately
...@@ -507,7 +507,7 @@ static int __init check_legacy_serial_console(void) ...@@ -507,7 +507,7 @@ static int __init check_legacy_serial_console(void)
struct device_node *prom_stdout = NULL; struct device_node *prom_stdout = NULL;
int i, speed = 0, offset = 0; int i, speed = 0, offset = 0;
const char *name; const char *name;
const u32 *spd; const __be32 *spd;
DBG(" -> check_legacy_serial_console()\n"); DBG(" -> check_legacy_serial_console()\n");
...@@ -547,7 +547,7 @@ static int __init check_legacy_serial_console(void) ...@@ -547,7 +547,7 @@ static int __init check_legacy_serial_console(void)
} }
spd = of_get_property(prom_stdout, "current-speed", NULL); spd = of_get_property(prom_stdout, "current-speed", NULL);
if (spd) if (spd)
speed = *spd; speed = be32_to_cpup(spd);
if (strcmp(name, "serial") != 0) if (strcmp(name, "serial") != 0)
goto not_found; goto not_found;
......
...@@ -364,10 +364,15 @@ static int __init early_init_dt_scan_cpus(unsigned long node, ...@@ -364,10 +364,15 @@ static int __init early_init_dt_scan_cpus(unsigned long node,
return 0; return 0;
} }
void __init early_init_dt_scan_chosen_arch(unsigned long node) int __init early_init_dt_scan_chosen_ppc(unsigned long node, const char *uname,
int depth, void *data)
{ {
unsigned long *lprop; unsigned long *lprop;
/* Use common scan routine to determine if this is the chosen node */
if (early_init_dt_scan_chosen(node, uname, depth, data) == 0)
return 0;
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
/* check if iommu is forced on or off */ /* check if iommu is forced on or off */
if (of_get_flat_dt_prop(node, "linux,iommu-off", NULL) != NULL) if (of_get_flat_dt_prop(node, "linux,iommu-off", NULL) != NULL)
...@@ -399,6 +404,9 @@ void __init early_init_dt_scan_chosen_arch(unsigned long node) ...@@ -399,6 +404,9 @@ void __init early_init_dt_scan_chosen_arch(unsigned long node)
if (lprop) if (lprop)
crashk_res.end = crashk_res.start + *lprop - 1; crashk_res.end = crashk_res.start + *lprop - 1;
#endif #endif
/* break now */
return 1;
} }
#ifdef CONFIG_PPC_PSERIES #ifdef CONFIG_PPC_PSERIES
...@@ -683,7 +691,7 @@ void __init early_init_devtree(void *params) ...@@ -683,7 +691,7 @@ void __init early_init_devtree(void *params)
* device-tree, including the platform type, initrd location and * device-tree, including the platform type, initrd location and
* size, TCE reserve, and more ... * size, TCE reserve, and more ...
*/ */
of_scan_flat_dt(early_init_dt_scan_chosen, NULL); of_scan_flat_dt(early_init_dt_scan_chosen_ppc, NULL);
/* Scan memory nodes and rebuild MEMBLOCKs */ /* Scan memory nodes and rebuild MEMBLOCKs */
memblock_init(); memblock_init();
......
...@@ -19,6 +19,7 @@ config SPARC ...@@ -19,6 +19,7 @@ config SPARC
bool bool
default y default y
select OF select OF
select OF_PROMTREE
select HAVE_IDE select HAVE_IDE
select HAVE_OPROFILE select HAVE_OPROFILE
select HAVE_ARCH_KGDB if !SMP || SPARC64 select HAVE_ARCH_KGDB if !SMP || SPARC64
......
...@@ -7,7 +7,6 @@ header-y += display7seg.h ...@@ -7,7 +7,6 @@ header-y += display7seg.h
header-y += envctrl.h header-y += envctrl.h
header-y += fbio.h header-y += fbio.h
header-y += jsflash.h header-y += jsflash.h
header-y += openprom.h
header-y += openpromio.h header-y += openpromio.h
header-y += perfctr.h header-y += perfctr.h
header-y += psrcompat.h header-y += psrcompat.h
......
...@@ -304,7 +304,8 @@ static struct linux_prom_registers fd_regs[2]; ...@@ -304,7 +304,8 @@ static struct linux_prom_registers fd_regs[2];
static int sun_floppy_init(void) static int sun_floppy_init(void)
{ {
char state[128]; char state[128];
int tnode, fd_node, num_regs; phandle tnode, fd_node;
int num_regs;
struct resource r; struct resource r;
use_virtual_dma = 1; use_virtual_dma = 1;
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
#define LINUX_OPPROM_MAGIC 0x10010407 #define LINUX_OPPROM_MAGIC 0x10010407
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#include <linux/of.h>
/* V0 prom device operations. */ /* V0 prom device operations. */
struct linux_dev_v0_funcs { struct linux_dev_v0_funcs {
int (*v0_devopen)(char *device_str); int (*v0_devopen)(char *device_str);
...@@ -26,7 +28,7 @@ struct linux_dev_v0_funcs { ...@@ -26,7 +28,7 @@ struct linux_dev_v0_funcs {
/* V2 and later prom device operations. */ /* V2 and later prom device operations. */
struct linux_dev_v2_funcs { struct linux_dev_v2_funcs {
int (*v2_inst2pkg)(int d); /* Convert ihandle to phandle */ phandle (*v2_inst2pkg)(int d); /* Convert ihandle to phandle */
char * (*v2_dumb_mem_alloc)(char *va, unsigned sz); char * (*v2_dumb_mem_alloc)(char *va, unsigned sz);
void (*v2_dumb_mem_free)(char *va, unsigned sz); void (*v2_dumb_mem_free)(char *va, unsigned sz);
...@@ -168,12 +170,12 @@ struct linux_romvec { ...@@ -168,12 +170,12 @@ struct linux_romvec {
/* Routines for traversing the prom device tree. */ /* Routines for traversing the prom device tree. */
struct linux_nodeops { struct linux_nodeops {
int (*no_nextnode)(int node); phandle (*no_nextnode)(phandle node);
int (*no_child)(int node); phandle (*no_child)(phandle node);
int (*no_proplen)(int node, const char *name); int (*no_proplen)(phandle node, const char *name);
int (*no_getprop)(int node, const char *name, char *val); int (*no_getprop)(phandle node, const char *name, char *val);
int (*no_setprop)(int node, const char *name, char *val, int len); int (*no_setprop)(phandle node, const char *name, char *val, int len);
char * (*no_nextprop)(int node, char *name); char * (*no_nextprop)(phandle node, char *name);
}; };
/* More fun PROM structures for device probing. */ /* More fun PROM structures for device probing. */
......
...@@ -30,7 +30,7 @@ extern unsigned int prom_rev, prom_prev; ...@@ -30,7 +30,7 @@ extern unsigned int prom_rev, prom_prev;
/* Root node of the prom device tree, this stays constant after /* Root node of the prom device tree, this stays constant after
* initialization is complete. * initialization is complete.
*/ */
extern int prom_root_node; extern phandle prom_root_node;
/* Pointer to prom structure containing the device tree traversal /* Pointer to prom structure containing the device tree traversal
* and usage utility functions. Only prom-lib should use these, * and usage utility functions. Only prom-lib should use these,
...@@ -178,68 +178,68 @@ extern void prom_putsegment(int context, unsigned long virt_addr, ...@@ -178,68 +178,68 @@ extern void prom_putsegment(int context, unsigned long virt_addr,
/* PROM device tree traversal functions... */ /* PROM device tree traversal functions... */
/* Get the child node of the given node, or zero if no child exists. */ /* Get the child node of the given node, or zero if no child exists. */
extern int prom_getchild(int parent_node); extern phandle prom_getchild(phandle parent_node);
/* Get the next sibling node of the given node, or zero if no further /* Get the next sibling node of the given node, or zero if no further
* siblings exist. * siblings exist.
*/ */
extern int prom_getsibling(int node); extern phandle prom_getsibling(phandle node);
/* Get the length, at the passed node, of the given property type. /* Get the length, at the passed node, of the given property type.
* Returns -1 on error (ie. no such property at this node). * Returns -1 on error (ie. no such property at this node).
*/ */
extern int prom_getproplen(int thisnode, const char *property); extern int prom_getproplen(phandle thisnode, const char *property);
/* Fetch the requested property using the given buffer. Returns /* Fetch the requested property using the given buffer. Returns
* the number of bytes the prom put into your buffer or -1 on error. * the number of bytes the prom put into your buffer or -1 on error.
*/ */
extern int __must_check prom_getproperty(int thisnode, const char *property, extern int __must_check prom_getproperty(phandle thisnode, const char *property,
char *prop_buffer, int propbuf_size); char *prop_buffer, int propbuf_size);
/* Acquire an integer property. */ /* Acquire an integer property. */
extern int prom_getint(int node, char *property); extern int prom_getint(phandle node, char *property);
/* Acquire an integer property, with a default value. */ /* Acquire an integer property, with a default value. */
extern int prom_getintdefault(int node, char *property, int defval); extern int prom_getintdefault(phandle node, char *property, int defval);
/* Acquire a boolean property, 0=FALSE 1=TRUE. */ /* Acquire a boolean property, 0=FALSE 1=TRUE. */
extern int prom_getbool(int node, char *prop); extern int prom_getbool(phandle node, char *prop);
/* Acquire a string property, null string on error. */ /* Acquire a string property, null string on error. */
extern void prom_getstring(int node, char *prop, char *buf, int bufsize); extern void prom_getstring(phandle node, char *prop, char *buf, int bufsize);
/* Does the passed node have the given "name"? YES=1 NO=0 */ /* Does the passed node have the given "name"? YES=1 NO=0 */
extern int prom_nodematch(int thisnode, char *name); extern int prom_nodematch(phandle thisnode, char *name);
/* Search all siblings starting at the passed node for "name" matching /* Search all siblings starting at the passed node for "name" matching
* the given string. Returns the node on success, zero on failure. * the given string. Returns the node on success, zero on failure.
*/ */
extern int prom_searchsiblings(int node_start, char *name); extern phandle prom_searchsiblings(phandle node_start, char *name);
/* Return the first property type, as a string, for the given node. /* Return the first property type, as a string, for the given node.
* Returns a null string on error. * Returns a null string on error.
*/ */
extern char *prom_firstprop(int node, char *buffer); extern char *prom_firstprop(phandle node, char *buffer);
/* Returns the next property after the passed property for the given /* Returns the next property after the passed property for the given
* node. Returns null string on failure. * node. Returns null string on failure.
*/ */
extern char *prom_nextprop(int node, char *prev_property, char *buffer); extern char *prom_nextprop(phandle node, char *prev_property, char *buffer);
/* Returns phandle of the path specified */ /* Returns phandle of the path specified */
extern int prom_finddevice(char *name); extern phandle prom_finddevice(char *name);
/* Returns 1 if the specified node has given property. */ /* Returns 1 if the specified node has given property. */
extern int prom_node_has_property(int node, char *property); extern int prom_node_has_property(phandle node, char *property);
/* Set the indicated property at the given node with the passed value. /* Set the indicated property at the given node with the passed value.
* Returns the number of bytes of your value that the prom took. * Returns the number of bytes of your value that the prom took.
*/ */
extern int prom_setprop(int node, const char *prop_name, char *prop_value, extern int prom_setprop(phandle node, const char *prop_name, char *prop_value,
int value_size); int value_size);
extern int prom_pathtoinode(char *path); extern phandle prom_pathtoinode(char *path);
extern int prom_inst2pkg(int); extern phandle prom_inst2pkg(int);
/* Dorking with Bus ranges... */ /* Dorking with Bus ranges... */
...@@ -247,13 +247,13 @@ extern int prom_inst2pkg(int); ...@@ -247,13 +247,13 @@ extern int prom_inst2pkg(int);
extern void prom_apply_obio_ranges(struct linux_prom_registers *obioregs, int nregs); extern void prom_apply_obio_ranges(struct linux_prom_registers *obioregs, int nregs);
/* Apply ranges of any prom node (and optionally parent node as well) to registers. */ /* Apply ranges of any prom node (and optionally parent node as well) to registers. */
extern void prom_apply_generic_ranges(int node, int parent, extern void prom_apply_generic_ranges(phandle node, phandle parent,
struct linux_prom_registers *sbusregs, int nregs); struct linux_prom_registers *sbusregs, int nregs);
/* CPU probing helpers. */ /* CPU probing helpers. */
int cpu_find_by_instance(int instance, int *prom_node, int *mid); int cpu_find_by_instance(int instance, phandle *prom_node, int *mid);
int cpu_find_by_mid(int mid, int *prom_node); int cpu_find_by_mid(int mid, phandle *prom_node);
int cpu_get_hwmid(int prom_node); int cpu_get_hwmid(phandle prom_node);
extern spinlock_t prom_lock; extern spinlock_t prom_lock;
......
...@@ -16,7 +16,7 @@ extern char prom_version[]; ...@@ -16,7 +16,7 @@ extern char prom_version[];
/* Root node of the prom device tree, this stays constant after /* Root node of the prom device tree, this stays constant after
* initialization is complete. * initialization is complete.
*/ */
extern int prom_root_node; extern phandle prom_root_node;
/* PROM stdin and stdout */ /* PROM stdin and stdout */
extern int prom_stdin, prom_stdout; extern int prom_stdin, prom_stdout;
...@@ -24,7 +24,7 @@ extern int prom_stdin, prom_stdout; ...@@ -24,7 +24,7 @@ extern int prom_stdin, prom_stdout;
/* /chosen node of the prom device tree, this stays constant after /* /chosen node of the prom device tree, this stays constant after
* initialization is complete. * initialization is complete.
*/ */
extern int prom_chosen_node; extern phandle prom_chosen_node;
/* Helper values and strings in arch/sparc64/kernel/head.S */ /* Helper values and strings in arch/sparc64/kernel/head.S */
extern const char prom_peer_name[]; extern const char prom_peer_name[];
...@@ -218,68 +218,69 @@ extern void prom_unmap(unsigned long size, unsigned long vaddr); ...@@ -218,68 +218,69 @@ extern void prom_unmap(unsigned long size, unsigned long vaddr);
/* PROM device tree traversal functions... */ /* PROM device tree traversal functions... */
/* Get the child node of the given node, or zero if no child exists. */ /* Get the child node of the given node, or zero if no child exists. */
extern int prom_getchild(int parent_node); extern phandle prom_getchild(phandle parent_node);
/* Get the next sibling node of the given node, or zero if no further /* Get the next sibling node of the given node, or zero if no further
* siblings exist. * siblings exist.
*/ */
extern int prom_getsibling(int node); extern phandle prom_getsibling(phandle node);
/* Get the length, at the passed node, of the given property type. /* Get the length, at the passed node, of the given property type.
* Returns -1 on error (ie. no such property at this node). * Returns -1 on error (ie. no such property at this node).
*/ */
extern int prom_getproplen(int thisnode, const char *property); extern int prom_getproplen(phandle thisnode, const char *property);
/* Fetch the requested property using the given buffer. Returns /* Fetch the requested property using the given buffer. Returns
* the number of bytes the prom put into your buffer or -1 on error. * the number of bytes the prom put into your buffer or -1 on error.
*/ */
extern int prom_getproperty(int thisnode, const char *property, extern int prom_getproperty(phandle thisnode, const char *property,
char *prop_buffer, int propbuf_size); char *prop_buffer, int propbuf_size);
/* Acquire an integer property. */ /* Acquire an integer property. */
extern int prom_getint(int node, const char *property); extern int prom_getint(phandle node, const char *property);
/* Acquire an integer property, with a default value. */ /* Acquire an integer property, with a default value. */
extern int prom_getintdefault(int node, const char *property, int defval); extern int prom_getintdefault(phandle node, const char *property, int defval);
/* Acquire a boolean property, 0=FALSE 1=TRUE. */ /* Acquire a boolean property, 0=FALSE 1=TRUE. */
extern int prom_getbool(int node, const char *prop); extern int prom_getbool(phandle node, const char *prop);
/* Acquire a string property, null string on error. */ /* Acquire a string property, null string on error. */
extern void prom_getstring(int node, const char *prop, char *buf, int bufsize); extern void prom_getstring(phandle node, const char *prop, char *buf,
int bufsize);
/* Does the passed node have the given "name"? YES=1 NO=0 */ /* Does the passed node have the given "name"? YES=1 NO=0 */
extern int prom_nodematch(int thisnode, const char *name); extern int prom_nodematch(phandle thisnode, const char *name);
/* Search all siblings starting at the passed node for "name" matching /* Search all siblings starting at the passed node for "name" matching
* the given string. Returns the node on success, zero on failure. * the given string. Returns the node on success, zero on failure.
*/ */
extern int prom_searchsiblings(int node_start, const char *name); extern phandle prom_searchsiblings(phandle node_start, const char *name);
/* Return the first property type, as a string, for the given node. /* Return the first property type, as a string, for the given node.
* Returns a null string on error. Buffer should be at least 32B long. * Returns a null string on error. Buffer should be at least 32B long.
*/ */
extern char *prom_firstprop(int node, char *buffer); extern char *prom_firstprop(phandle node, char *buffer);
/* Returns the next property after the passed property for the given /* Returns the next property after the passed property for the given
* node. Returns null string on failure. Buffer should be at least 32B long. * node. Returns null string on failure. Buffer should be at least 32B long.
*/ */
extern char *prom_nextprop(int node, const char *prev_property, char *buffer); extern char *prom_nextprop(phandle node, const char *prev_property, char *buf);
/* Returns 1 if the specified node has given property. */ /* Returns 1 if the specified node has given property. */
extern int prom_node_has_property(int node, const char *property); extern int prom_node_has_property(phandle node, const char *property);
/* Returns phandle of the path specified */ /* Returns phandle of the path specified */
extern int prom_finddevice(const char *name); extern phandle prom_finddevice(const char *name);
/* Set the indicated property at the given node with the passed value. /* Set the indicated property at the given node with the passed value.
* Returns the number of bytes of your value that the prom took. * Returns the number of bytes of your value that the prom took.
*/ */
extern int prom_setprop(int node, const char *prop_name, char *prop_value, extern int prom_setprop(phandle node, const char *prop_name, char *prop_value,
int value_size); int value_size);
extern int prom_pathtoinode(const char *path); extern phandle prom_pathtoinode(const char *path);
extern int prom_inst2pkg(int); extern phandle prom_inst2pkg(int);
extern int prom_service_exists(const char *service_name); extern int prom_service_exists(const char *service_name);
extern void prom_sun4v_guest_soft_state(void); extern void prom_sun4v_guest_soft_state(void);
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
* 2 of the License, or (at your option) any later version. * 2 of the License, or (at your option) any later version.
*/ */
#include <linux/types.h> #include <linux/types.h>
#include <linux/of_pdt.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <asm/atomic.h> #include <asm/atomic.h>
...@@ -67,8 +68,8 @@ extern struct device_node *of_console_device; ...@@ -67,8 +68,8 @@ extern struct device_node *of_console_device;
extern char *of_console_path; extern char *of_console_path;
extern char *of_console_options; extern char *of_console_options;
extern void (*prom_build_more)(struct device_node *dp, struct device_node ***nextp); extern void irq_trans_init(struct device_node *dp);
extern char *build_full_name(struct device_node *dp); extern char *build_path_component(struct device_node *dp);
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* _SPARC_PROM_H */ #endif /* _SPARC_PROM_H */
...@@ -23,7 +23,7 @@ static DEFINE_SPINLOCK(auxio_lock); ...@@ -23,7 +23,7 @@ static DEFINE_SPINLOCK(auxio_lock);
void __init auxio_probe(void) void __init auxio_probe(void)
{ {
int node, auxio_nd; phandle node, auxio_nd;
struct linux_prom_registers auxregs[1]; struct linux_prom_registers auxregs[1];
struct resource r; struct resource r;
...@@ -113,7 +113,7 @@ volatile unsigned char * auxio_power_register = NULL; ...@@ -113,7 +113,7 @@ volatile unsigned char * auxio_power_register = NULL;
void __init auxio_power_probe(void) void __init auxio_power_probe(void)
{ {
struct linux_prom_registers regs; struct linux_prom_registers regs;
int node; phandle node;
struct resource r; struct resource r;
/* Attempt to find the sun4m power control node. */ /* Attempt to find the sun4m power control node. */
......
...@@ -40,7 +40,7 @@ static unsigned char *dispDeviceBase __force_data; ...@@ -40,7 +40,7 @@ static unsigned char *dispDeviceBase __force_data;
static unsigned char vga_font[cmapsz]; static unsigned char vga_font[cmapsz];
static int __init btext_initialize(unsigned int node) static int __init btext_initialize(phandle node)
{ {
unsigned int width, height, depth, pitch; unsigned int width, height, depth, pitch;
unsigned long address = 0; unsigned long address = 0;
...@@ -309,7 +309,7 @@ static struct console btext_console = { ...@@ -309,7 +309,7 @@ static struct console btext_console = {
int __init btext_find_display(void) int __init btext_find_display(void)
{ {
unsigned int node; phandle node;
char type[32]; char type[32];
int ret; int ret;
......
...@@ -31,9 +31,9 @@ static char *cpu_mid_prop(void) ...@@ -31,9 +31,9 @@ static char *cpu_mid_prop(void)
return "mid"; return "mid";
} }
static int check_cpu_node(int nd, int *cur_inst, static int check_cpu_node(phandle nd, int *cur_inst,
int (*compare)(int, int, void *), void *compare_arg, int (*compare)(phandle, int, void *), void *compare_arg,
int *prom_node, int *mid) phandle *prom_node, int *mid)
{ {
if (!compare(nd, *cur_inst, compare_arg)) { if (!compare(nd, *cur_inst, compare_arg)) {
if (prom_node) if (prom_node)
...@@ -51,8 +51,8 @@ static int check_cpu_node(int nd, int *cur_inst, ...@@ -51,8 +51,8 @@ static int check_cpu_node(int nd, int *cur_inst,
return -ENODEV; return -ENODEV;
} }
static int __cpu_find_by(int (*compare)(int, int, void *), void *compare_arg, static int __cpu_find_by(int (*compare)(phandle, int, void *),
int *prom_node, int *mid) void *compare_arg, phandle *prom_node, int *mid)
{ {
struct device_node *dp; struct device_node *dp;
int cur_inst; int cur_inst;
...@@ -71,7 +71,7 @@ static int __cpu_find_by(int (*compare)(int, int, void *), void *compare_arg, ...@@ -71,7 +71,7 @@ static int __cpu_find_by(int (*compare)(int, int, void *), void *compare_arg,
return -ENODEV; return -ENODEV;
} }
static int cpu_instance_compare(int nd, int instance, void *_arg) static int cpu_instance_compare(phandle nd, int instance, void *_arg)
{ {
int desired_instance = (int) _arg; int desired_instance = (int) _arg;
...@@ -80,13 +80,13 @@ static int cpu_instance_compare(int nd, int instance, void *_arg) ...@@ -80,13 +80,13 @@ static int cpu_instance_compare(int nd, int instance, void *_arg)
return -ENODEV; return -ENODEV;
} }
int cpu_find_by_instance(int instance, int *prom_node, int *mid) int cpu_find_by_instance(int instance, phandle *prom_node, int *mid)
{ {
return __cpu_find_by(cpu_instance_compare, (void *)instance, return __cpu_find_by(cpu_instance_compare, (void *)instance,
prom_node, mid); prom_node, mid);
} }
static int cpu_mid_compare(int nd, int instance, void *_arg) static int cpu_mid_compare(phandle nd, int instance, void *_arg)
{ {
int desired_mid = (int) _arg; int desired_mid = (int) _arg;
int this_mid; int this_mid;
...@@ -98,7 +98,7 @@ static int cpu_mid_compare(int nd, int instance, void *_arg) ...@@ -98,7 +98,7 @@ static int cpu_mid_compare(int nd, int instance, void *_arg)
return -ENODEV; return -ENODEV;
} }
int cpu_find_by_mid(int mid, int *prom_node) int cpu_find_by_mid(int mid, phandle *prom_node)
{ {
return __cpu_find_by(cpu_mid_compare, (void *)mid, return __cpu_find_by(cpu_mid_compare, (void *)mid,
prom_node, NULL); prom_node, NULL);
...@@ -108,7 +108,7 @@ int cpu_find_by_mid(int mid, int *prom_node) ...@@ -108,7 +108,7 @@ int cpu_find_by_mid(int mid, int *prom_node)
* address (0-3). This gives us the true hardware mid, which might have * address (0-3). This gives us the true hardware mid, which might have
* some other bits set. On 4d hardware and software mids are the same. * some other bits set. On 4d hardware and software mids are the same.
*/ */
int cpu_get_hwmid(int prom_node) int cpu_get_hwmid(phandle prom_node)
{ {
return prom_getintdefault(prom_node, cpu_mid_prop(), -ENODEV); return prom_getintdefault(prom_node, cpu_mid_prop(), -ENODEV);
} }
...@@ -119,7 +119,8 @@ void __init device_scan(void) ...@@ -119,7 +119,8 @@ void __init device_scan(void)
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
{ {
int err, cpu_node; phandle cpu_node;
int err;
err = cpu_find_by_instance(0, &cpu_node, NULL); err = cpu_find_by_instance(0, &cpu_node, NULL);
if (err) { if (err) {
/* Probably a sun4e, Sun is trying to trick us ;-) */ /* Probably a sun4e, Sun is trying to trick us ;-) */
......
...@@ -282,5 +282,5 @@ void __init leon_init_IRQ(void) ...@@ -282,5 +282,5 @@ void __init leon_init_IRQ(void)
void __init leon_init(void) void __init leon_init(void)
{ {
prom_build_more = &leon_node_init; of_pdt_build_more = &leon_node_init;
} }
...@@ -284,7 +284,7 @@ int __init pcic_probe(void) ...@@ -284,7 +284,7 @@ int __init pcic_probe(void)
struct linux_prom_registers regs[PROMREG_MAX]; struct linux_prom_registers regs[PROMREG_MAX];
struct linux_pbm_info* pbm; struct linux_pbm_info* pbm;
char namebuf[64]; char namebuf[64];
int node; phandle node;
int err; int err;
if (pcic0_up) { if (pcic0_up) {
...@@ -440,7 +440,7 @@ static int __devinit pdev_to_pnode(struct linux_pbm_info *pbm, ...@@ -440,7 +440,7 @@ static int __devinit pdev_to_pnode(struct linux_pbm_info *pbm,
{ {
struct linux_prom_pci_registers regs[PROMREG_MAX]; struct linux_prom_pci_registers regs[PROMREG_MAX];
int err; int err;
int node = prom_getchild(pbm->prom_node); phandle node = prom_getchild(pbm->prom_node);
while(node) { while(node) {
err = prom_getproperty(node, "reg", err = prom_getproperty(node, "reg",
......
...@@ -4,12 +4,6 @@ ...@@ -4,12 +4,6 @@
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <asm/prom.h> #include <asm/prom.h>
extern void * prom_early_alloc(unsigned long size);
extern void irq_trans_init(struct device_node *dp);
extern unsigned int prom_unique_id;
extern char *build_path_component(struct device_node *dp);
extern void of_console_init(void); extern void of_console_init(void);
extern unsigned int prom_early_allocated; extern unsigned int prom_early_allocated;
......
...@@ -20,14 +20,13 @@ ...@@ -20,14 +20,13 @@
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_pdt.h>
#include <asm/prom.h> #include <asm/prom.h>
#include <asm/oplib.h> #include <asm/oplib.h>
#include <asm/leon.h> #include <asm/leon.h>
#include "prom.h" #include "prom.h"
void (*prom_build_more)(struct device_node *dp, struct device_node ***nextp);
struct device_node *of_console_device; struct device_node *of_console_device;
EXPORT_SYMBOL(of_console_device); EXPORT_SYMBOL(of_console_device);
...@@ -119,192 +118,47 @@ int of_find_in_proplist(const char *list, const char *match, int len) ...@@ -119,192 +118,47 @@ int of_find_in_proplist(const char *list, const char *match, int len)
} }
EXPORT_SYMBOL(of_find_in_proplist); EXPORT_SYMBOL(of_find_in_proplist);
unsigned int prom_unique_id; /*
* SPARC32 and SPARC64's prom_nextprop() do things differently
static struct property * __init build_one_prop(phandle node, char *prev, * here, despite sharing the same interface. SPARC32 doesn't fill in 'buf',
char *special_name, * returning NULL on an error. SPARC64 fills in 'buf', but sets it to an
void *special_val, * empty string upon error.
int special_len) */
static int __init handle_nextprop_quirks(char *buf, const char *name)
{ {
static struct property *tmp = NULL; if (!name || strlen(name) == 0)
struct property *p; return -1;
const char *name;
if (tmp) {
p = tmp;
memset(p, 0, sizeof(*p) + 32);
tmp = NULL;
} else {
p = prom_early_alloc(sizeof(struct property) + 32);
p->unique_id = prom_unique_id++;
}
p->name = (char *) (p + 1);
if (special_name) {
strcpy(p->name, special_name);
p->length = special_len;
p->value = prom_early_alloc(special_len);
memcpy(p->value, special_val, special_len);
} else {
if (prev == NULL) {
name = prom_firstprop(node, p->name);
} else {
name = prom_nextprop(node, prev, p->name);
}
if (!name || strlen(name) == 0) {
tmp = p;
return NULL;
}
#ifdef CONFIG_SPARC32 #ifdef CONFIG_SPARC32
strcpy(p->name, name); strcpy(buf, name);
#endif #endif
p->length = prom_getproplen(node, p->name); return 0;
if (p->length <= 0) {
p->length = 0;
} else {
int len;
p->value = prom_early_alloc(p->length + 1);
len = prom_getproperty(node, p->name, p->value,
p->length);
if (len <= 0)
p->length = 0;
((unsigned char *)p->value)[p->length] = '\0';
}
}
return p;
}
static struct property * __init build_prop_list(phandle node)
{
struct property *head, *tail;
head = tail = build_one_prop(node, NULL,
".node", &node, sizeof(node));
tail->next = build_one_prop(node, NULL, NULL, NULL, 0);
tail = tail->next;
while(tail) {
tail->next = build_one_prop(node, tail->name,
NULL, NULL, 0);
tail = tail->next;
}
return head;
}
static char * __init get_one_property(phandle node, const char *name)
{
char *buf = "<NULL>";
int len;
len = prom_getproplen(node, name);
if (len > 0) {
buf = prom_early_alloc(len);
len = prom_getproperty(node, name, buf, len);
}
return buf;
}
static struct device_node * __init prom_create_node(phandle node,
struct device_node *parent)
{
struct device_node *dp;
if (!node)
return NULL;
dp = prom_early_alloc(sizeof(*dp));
dp->unique_id = prom_unique_id++;
dp->parent = parent;
kref_init(&dp->kref);
dp->name = get_one_property(node, "name");
dp->type = get_one_property(node, "device_type");
dp->phandle = node;
dp->properties = build_prop_list(node);
irq_trans_init(dp);
return dp;
}
char * __init build_full_name(struct device_node *dp)
{
int len, ourlen, plen;
char *n;
plen = strlen(dp->parent->full_name);
ourlen = strlen(dp->path_component_name);
len = ourlen + plen + 2;
n = prom_early_alloc(len);
strcpy(n, dp->parent->full_name);
if (!of_node_is_root(dp->parent)) {
strcpy(n + plen, "/");
plen++;
}
strcpy(n + plen, dp->path_component_name);
return n;
} }
static struct device_node * __init prom_build_tree(struct device_node *parent, static int __init prom_common_nextprop(phandle node, char *prev, char *buf)
phandle node,
struct device_node ***nextp)
{ {
struct device_node *ret = NULL, *prev_sibling = NULL; const char *name;
struct device_node *dp;
while (1) {
dp = prom_create_node(node, parent);
if (!dp)
break;
if (prev_sibling)
prev_sibling->sibling = dp;
if (!ret)
ret = dp;
prev_sibling = dp;
*(*nextp) = dp;
*nextp = &dp->allnext;
dp->path_component_name = build_path_component(dp);
dp->full_name = build_full_name(dp);
dp->child = prom_build_tree(dp, prom_getchild(node), nextp);
if (prom_build_more)
prom_build_more(dp, nextp);
node = prom_getsibling(node);
}
return ret; buf[0] = '\0';
name = prom_nextprop(node, prev, buf);
return handle_nextprop_quirks(buf, name);
} }
unsigned int prom_early_allocated __initdata; unsigned int prom_early_allocated __initdata;
static struct of_pdt_ops prom_sparc_ops __initdata = {
.nextprop = prom_common_nextprop,
.getproplen = prom_getproplen,
.getproperty = prom_getproperty,
.getchild = prom_getchild,
.getsibling = prom_getsibling,
};
void __init prom_build_devicetree(void) void __init prom_build_devicetree(void)
{ {
struct device_node **nextp; of_pdt_build_devicetree(prom_root_node, &prom_sparc_ops);
allnodes = prom_create_node(prom_root_node, NULL);
allnodes->path_component_name = "";
allnodes->full_name = "/";
nextp = &allnodes->allnext;
allnodes->child = prom_build_tree(allnodes,
prom_getchild(allnodes->phandle),
&nextp);
of_console_init(); of_console_init();
printk("PROM: Built device tree with %u bytes of memory.\n", pr_info("PROM: Built device tree with %u bytes of memory.\n",
prom_early_allocated); prom_early_allocated);
} }
...@@ -315,7 +315,7 @@ void __init setup_arch(char **cmdline_p) ...@@ -315,7 +315,7 @@ void __init setup_arch(char **cmdline_p)
#ifdef CONFIG_IP_PNP #ifdef CONFIG_IP_PNP
if (!ic_set_manually) { if (!ic_set_manually) {
int chosen = prom_finddevice ("/chosen"); phandle chosen = prom_finddevice("/chosen");
u32 cl, sv, gw; u32 cl, sv, gw;
cl = prom_getintdefault (chosen, "client-ip", 0); cl = prom_getintdefault (chosen, "client-ip", 0);
......
...@@ -23,7 +23,7 @@ int this_is_starfire = 0; ...@@ -23,7 +23,7 @@ int this_is_starfire = 0;
void check_if_starfire(void) void check_if_starfire(void)
{ {
int ssnode = prom_finddevice("/ssp-serial"); phandle ssnode = prom_finddevice("/ssp-serial");
if (ssnode != 0 && ssnode != -1) if (ssnode != 0 && ssnode != -1)
this_is_starfire = 1; this_is_starfire = 1;
} }
......
...@@ -100,7 +100,7 @@ static void swift_clockstop(void) ...@@ -100,7 +100,7 @@ static void swift_clockstop(void)
void __init clock_stop_probe(void) void __init clock_stop_probe(void)
{ {
unsigned int node, clk_nd; phandle node, clk_nd;
char name[20]; char name[20];
prom_getstring(prom_root_node, "name", name, sizeof(name)); prom_getstring(prom_root_node, "name", name, sizeof(name));
......
...@@ -88,7 +88,7 @@ static void __init read_obp_memory(const char *property, ...@@ -88,7 +88,7 @@ static void __init read_obp_memory(const char *property,
struct linux_prom64_registers *regs, struct linux_prom64_registers *regs,
int *num_ents) int *num_ents)
{ {
int node = prom_finddevice("/memory"); phandle node = prom_finddevice("/memory");
int prop_size = prom_getproplen(node, property); int prop_size = prom_getproplen(node, property);
int ents, ret, i; int ents, ret, i;
......
...@@ -1262,7 +1262,8 @@ extern unsigned long bootmem_init(unsigned long *pages_avail); ...@@ -1262,7 +1262,8 @@ extern unsigned long bootmem_init(unsigned long *pages_avail);
void __init srmmu_paging_init(void) void __init srmmu_paging_init(void)
{ {
int i, cpunode; int i;
phandle cpunode;
char node_str[128]; char node_str[128];
pgd_t *pgd; pgd_t *pgd;
pmd_t *pmd; pmd_t *pmd;
...@@ -1398,7 +1399,8 @@ static void __init srmmu_is_bad(void) ...@@ -1398,7 +1399,8 @@ static void __init srmmu_is_bad(void)
static void __init init_vac_layout(void) static void __init init_vac_layout(void)
{ {
int nd, cache_lines; phandle nd;
int cache_lines;
char node_str[128]; char node_str[128];
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
int cpu = 0; int cpu = 0;
...@@ -2082,7 +2084,7 @@ static void __init get_srmmu_type(void) ...@@ -2082,7 +2084,7 @@ static void __init get_srmmu_type(void)
/* Next check for Fujitsu Swift. */ /* Next check for Fujitsu Swift. */
if(psr_typ == 0 && psr_vers == 4) { if(psr_typ == 0 && psr_vers == 4) {
int cpunode; phandle cpunode;
char node_str[128]; char node_str[128];
/* Look if it is not a TurboSparc emulating Swift... */ /* Look if it is not a TurboSparc emulating Swift... */
......
...@@ -420,7 +420,7 @@ volatile unsigned long __iomem *sun4c_memerr_reg = NULL; ...@@ -420,7 +420,7 @@ volatile unsigned long __iomem *sun4c_memerr_reg = NULL;
void __init sun4c_probe_memerr_reg(void) void __init sun4c_probe_memerr_reg(void)
{ {
int node; phandle node;
struct linux_prom_registers regs[1]; struct linux_prom_registers regs[1];
node = prom_getchild(prom_root_node); node = prom_getchild(prom_root_node);
......
...@@ -20,7 +20,7 @@ enum prom_major_version prom_vers; ...@@ -20,7 +20,7 @@ enum prom_major_version prom_vers;
unsigned int prom_rev, prom_prev; unsigned int prom_rev, prom_prev;
/* The root node of the prom device tree. */ /* The root node of the prom device tree. */
int prom_root_node; phandle prom_root_node;
EXPORT_SYMBOL(prom_root_node); EXPORT_SYMBOL(prom_root_node);
/* Pointer to the device tree operations structure. */ /* Pointer to the device tree operations structure. */
......
...@@ -19,7 +19,7 @@ char prom_version[80]; ...@@ -19,7 +19,7 @@ char prom_version[80];
/* The root node of the prom device tree. */ /* The root node of the prom device tree. */
int prom_stdin, prom_stdout; int prom_stdin, prom_stdout;
int prom_chosen_node; phandle prom_chosen_node;
/* You must call prom_init() before you attempt to use any of the /* You must call prom_init() before you attempt to use any of the
* routines in the prom library. It returns 0 on success, 1 on * routines in the prom library. It returns 0 on success, 1 on
...@@ -30,7 +30,7 @@ extern void prom_cif_init(void *, void *); ...@@ -30,7 +30,7 @@ extern void prom_cif_init(void *, void *);
void __init prom_init(void *cif_handler, void *cif_stack) void __init prom_init(void *cif_handler, void *cif_stack)
{ {
int node; phandle node;
prom_cif_init(cif_handler, cif_stack); prom_cif_init(cif_handler, cif_stack);
......
...@@ -31,7 +31,8 @@ static int __init prom_meminit_v0(void) ...@@ -31,7 +31,8 @@ static int __init prom_meminit_v0(void)
static int __init prom_meminit_v2(void) static int __init prom_meminit_v2(void)
{ {
struct linux_prom_registers reg[64]; struct linux_prom_registers reg[64];
int node, size, num_ents, i; phandle node;
int size, num_ents, i;
node = prom_searchsiblings(prom_getchild(prom_root_node), "memory"); node = prom_searchsiblings(prom_getchild(prom_root_node), "memory");
size = prom_getproperty(node, "available", (char *) reg, sizeof(reg)); size = prom_getproperty(node, "available", (char *) reg, sizeof(reg));
......
...@@ -183,7 +183,8 @@ unsigned char prom_get_idprom(char *idbuf, int num_bytes) ...@@ -183,7 +183,8 @@ unsigned char prom_get_idprom(char *idbuf, int num_bytes)
int prom_get_mmu_ihandle(void) int prom_get_mmu_ihandle(void)
{ {
int node, ret; phandle node;
int ret;
if (prom_mmu_ihandle_cache != 0) if (prom_mmu_ihandle_cache != 0)
return prom_mmu_ihandle_cache; return prom_mmu_ihandle_cache;
...@@ -201,7 +202,8 @@ int prom_get_mmu_ihandle(void) ...@@ -201,7 +202,8 @@ int prom_get_mmu_ihandle(void)
static int prom_get_memory_ihandle(void) static int prom_get_memory_ihandle(void)
{ {
static int memory_ihandle_cache; static int memory_ihandle_cache;
int node, ret; phandle node;
int ret;
if (memory_ihandle_cache != 0) if (memory_ihandle_cache != 0)
return memory_ihandle_cache; return memory_ihandle_cache;
......
...@@ -68,7 +68,7 @@ EXPORT_SYMBOL(prom_apply_obio_ranges); ...@@ -68,7 +68,7 @@ EXPORT_SYMBOL(prom_apply_obio_ranges);
void __init prom_ranges_init(void) void __init prom_ranges_init(void)
{ {
int node, obio_node; phandle node, obio_node;
int success; int success;
num_obio_ranges = 0; num_obio_ranges = 0;
...@@ -89,8 +89,8 @@ void __init prom_ranges_init(void) ...@@ -89,8 +89,8 @@ void __init prom_ranges_init(void)
prom_printf("PROMLIB: obio_ranges %d\n", num_obio_ranges); prom_printf("PROMLIB: obio_ranges %d\n", num_obio_ranges);
} }
void void prom_apply_generic_ranges(phandle node, phandle parent,
prom_apply_generic_ranges (int node, int parent, struct linux_prom_registers *regs, int nregs) struct linux_prom_registers *regs, int nregs)
{ {
int success; int success;
int num_ranges; int num_ranges;
......
...@@ -20,10 +20,10 @@ extern void restore_current(void); ...@@ -20,10 +20,10 @@ extern void restore_current(void);
static char promlib_buf[128]; static char promlib_buf[128];
/* Internal version of prom_getchild that does not alter return values. */ /* Internal version of prom_getchild that does not alter return values. */
int __prom_getchild(int node) phandle __prom_getchild(phandle node)
{ {
unsigned long flags; unsigned long flags;
int cnode; phandle cnode;
spin_lock_irqsave(&prom_lock, flags); spin_lock_irqsave(&prom_lock, flags);
cnode = prom_nodeops->no_child(node); cnode = prom_nodeops->no_child(node);
...@@ -36,9 +36,9 @@ int __prom_getchild(int node) ...@@ -36,9 +36,9 @@ int __prom_getchild(int node)
/* Return the child of node 'node' or zero if no this node has no /* Return the child of node 'node' or zero if no this node has no
* direct descendent. * direct descendent.
*/ */
int prom_getchild(int node) phandle prom_getchild(phandle node)
{ {
int cnode; phandle cnode;
if (node == -1) if (node == -1)
return 0; return 0;
...@@ -52,10 +52,10 @@ int prom_getchild(int node) ...@@ -52,10 +52,10 @@ int prom_getchild(int node)
EXPORT_SYMBOL(prom_getchild); EXPORT_SYMBOL(prom_getchild);
/* Internal version of prom_getsibling that does not alter return values. */ /* Internal version of prom_getsibling that does not alter return values. */
int __prom_getsibling(int node) phandle __prom_getsibling(phandle node)
{ {
unsigned long flags; unsigned long flags;
int cnode; phandle cnode;
spin_lock_irqsave(&prom_lock, flags); spin_lock_irqsave(&prom_lock, flags);
cnode = prom_nodeops->no_nextnode(node); cnode = prom_nodeops->no_nextnode(node);
...@@ -68,9 +68,9 @@ int __prom_getsibling(int node) ...@@ -68,9 +68,9 @@ int __prom_getsibling(int node)
/* Return the next sibling of node 'node' or zero if no more siblings /* Return the next sibling of node 'node' or zero if no more siblings
* at this level of depth in the tree. * at this level of depth in the tree.
*/ */
int prom_getsibling(int node) phandle prom_getsibling(phandle node)
{ {
int sibnode; phandle sibnode;
if (node == -1) if (node == -1)
return 0; return 0;
...@@ -86,7 +86,7 @@ EXPORT_SYMBOL(prom_getsibling); ...@@ -86,7 +86,7 @@ EXPORT_SYMBOL(prom_getsibling);
/* Return the length in bytes of property 'prop' at node 'node'. /* Return the length in bytes of property 'prop' at node 'node'.
* Return -1 on error. * Return -1 on error.
*/ */
int prom_getproplen(int node, const char *prop) int prom_getproplen(phandle node, const char *prop)
{ {
int ret; int ret;
unsigned long flags; unsigned long flags;
...@@ -106,7 +106,7 @@ EXPORT_SYMBOL(prom_getproplen); ...@@ -106,7 +106,7 @@ EXPORT_SYMBOL(prom_getproplen);
* 'buffer' which has a size of 'bufsize'. If the acquisition * 'buffer' which has a size of 'bufsize'. If the acquisition
* was successful the length will be returned, else -1 is returned. * was successful the length will be returned, else -1 is returned.
*/ */
int prom_getproperty(int node, const char *prop, char *buffer, int bufsize) int prom_getproperty(phandle node, const char *prop, char *buffer, int bufsize)
{ {
int plen, ret; int plen, ret;
unsigned long flags; unsigned long flags;
...@@ -126,7 +126,7 @@ EXPORT_SYMBOL(prom_getproperty); ...@@ -126,7 +126,7 @@ EXPORT_SYMBOL(prom_getproperty);
/* Acquire an integer property and return its value. Returns -1 /* Acquire an integer property and return its value. Returns -1
* on failure. * on failure.
*/ */
int prom_getint(int node, char *prop) int prom_getint(phandle node, char *prop)
{ {
static int intprop; static int intprop;
...@@ -140,7 +140,7 @@ EXPORT_SYMBOL(prom_getint); ...@@ -140,7 +140,7 @@ EXPORT_SYMBOL(prom_getint);
/* Acquire an integer property, upon error return the passed default /* Acquire an integer property, upon error return the passed default
* integer. * integer.
*/ */
int prom_getintdefault(int node, char *property, int deflt) int prom_getintdefault(phandle node, char *property, int deflt)
{ {
int retval; int retval;
...@@ -152,7 +152,7 @@ int prom_getintdefault(int node, char *property, int deflt) ...@@ -152,7 +152,7 @@ int prom_getintdefault(int node, char *property, int deflt)
EXPORT_SYMBOL(prom_getintdefault); EXPORT_SYMBOL(prom_getintdefault);
/* Acquire a boolean property, 1=TRUE 0=FALSE. */ /* Acquire a boolean property, 1=TRUE 0=FALSE. */
int prom_getbool(int node, char *prop) int prom_getbool(phandle node, char *prop)
{ {
int retval; int retval;
...@@ -166,7 +166,7 @@ EXPORT_SYMBOL(prom_getbool); ...@@ -166,7 +166,7 @@ EXPORT_SYMBOL(prom_getbool);
* string on error. The char pointer is the user supplied string * string on error. The char pointer is the user supplied string
* buffer. * buffer.
*/ */
void prom_getstring(int node, char *prop, char *user_buf, int ubuf_size) void prom_getstring(phandle node, char *prop, char *user_buf, int ubuf_size)
{ {
int len; int len;
...@@ -180,7 +180,7 @@ EXPORT_SYMBOL(prom_getstring); ...@@ -180,7 +180,7 @@ EXPORT_SYMBOL(prom_getstring);
/* Does the device at node 'node' have name 'name'? /* Does the device at node 'node' have name 'name'?
* YES = 1 NO = 0 * YES = 1 NO = 0
*/ */
int prom_nodematch(int node, char *name) int prom_nodematch(phandle node, char *name)
{ {
int error; int error;
...@@ -194,10 +194,11 @@ int prom_nodematch(int node, char *name) ...@@ -194,10 +194,11 @@ int prom_nodematch(int node, char *name)
/* Search siblings at 'node_start' for a node with name /* Search siblings at 'node_start' for a node with name
* 'nodename'. Return node if successful, zero if not. * 'nodename'. Return node if successful, zero if not.
*/ */
int prom_searchsiblings(int node_start, char *nodename) phandle prom_searchsiblings(phandle node_start, char *nodename)
{ {
int thisnode, error; phandle thisnode;
int error;
for(thisnode = node_start; thisnode; for(thisnode = node_start; thisnode;
thisnode=prom_getsibling(thisnode)) { thisnode=prom_getsibling(thisnode)) {
...@@ -213,7 +214,7 @@ int prom_searchsiblings(int node_start, char *nodename) ...@@ -213,7 +214,7 @@ int prom_searchsiblings(int node_start, char *nodename)
EXPORT_SYMBOL(prom_searchsiblings); EXPORT_SYMBOL(prom_searchsiblings);
/* Interal version of nextprop that does not alter return values. */ /* Interal version of nextprop that does not alter return values. */
char * __prom_nextprop(int node, char * oprop) char *__prom_nextprop(phandle node, char * oprop)
{ {
unsigned long flags; unsigned long flags;
char *prop; char *prop;
...@@ -228,7 +229,7 @@ char * __prom_nextprop(int node, char * oprop) ...@@ -228,7 +229,7 @@ char * __prom_nextprop(int node, char * oprop)
/* Return the first property name for node 'node'. */ /* Return the first property name for node 'node'. */
/* buffer is unused argument, but as v9 uses it, we need to have the same interface */ /* buffer is unused argument, but as v9 uses it, we need to have the same interface */
char * prom_firstprop(int node, char *bufer) char *prom_firstprop(phandle node, char *bufer)
{ {
if (node == 0 || node == -1) if (node == 0 || node == -1)
return ""; return "";
...@@ -241,7 +242,7 @@ EXPORT_SYMBOL(prom_firstprop); ...@@ -241,7 +242,7 @@ EXPORT_SYMBOL(prom_firstprop);
* at node 'node' . Returns empty string if no more * at node 'node' . Returns empty string if no more
* property types for this node. * property types for this node.
*/ */
char * prom_nextprop(int node, char *oprop, char *buffer) char *prom_nextprop(phandle node, char *oprop, char *buffer)
{ {
if (node == 0 || node == -1) if (node == 0 || node == -1)
return ""; return "";
...@@ -250,11 +251,11 @@ char * prom_nextprop(int node, char *oprop, char *buffer) ...@@ -250,11 +251,11 @@ char * prom_nextprop(int node, char *oprop, char *buffer)
} }
EXPORT_SYMBOL(prom_nextprop); EXPORT_SYMBOL(prom_nextprop);
int prom_finddevice(char *name) phandle prom_finddevice(char *name)
{ {
char nbuf[128]; char nbuf[128];
char *s = name, *d; char *s = name, *d;
int node = prom_root_node, node2; phandle node = prom_root_node, node2;
unsigned int which_io, phys_addr; unsigned int which_io, phys_addr;
struct linux_prom_registers reg[PROMREG_MAX]; struct linux_prom_registers reg[PROMREG_MAX];
...@@ -298,7 +299,7 @@ int prom_finddevice(char *name) ...@@ -298,7 +299,7 @@ int prom_finddevice(char *name)
} }
EXPORT_SYMBOL(prom_finddevice); EXPORT_SYMBOL(prom_finddevice);
int prom_node_has_property(int node, char *prop) int prom_node_has_property(phandle node, char *prop)
{ {
char *current_property = ""; char *current_property = "";
...@@ -314,7 +315,7 @@ EXPORT_SYMBOL(prom_node_has_property); ...@@ -314,7 +315,7 @@ EXPORT_SYMBOL(prom_node_has_property);
/* Set property 'pname' at node 'node' to value 'value' which has a length /* Set property 'pname' at node 'node' to value 'value' which has a length
* of 'size' bytes. Return the number of bytes the prom accepted. * of 'size' bytes. Return the number of bytes the prom accepted.
*/ */
int prom_setprop(int node, const char *pname, char *value, int size) int prom_setprop(phandle node, const char *pname, char *value, int size)
{ {
unsigned long flags; unsigned long flags;
int ret; int ret;
...@@ -329,9 +330,9 @@ int prom_setprop(int node, const char *pname, char *value, int size) ...@@ -329,9 +330,9 @@ int prom_setprop(int node, const char *pname, char *value, int size)
} }
EXPORT_SYMBOL(prom_setprop); EXPORT_SYMBOL(prom_setprop);
int prom_inst2pkg(int inst) phandle prom_inst2pkg(int inst)
{ {
int node; phandle node;
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&prom_lock, flags); spin_lock_irqsave(&prom_lock, flags);
...@@ -345,9 +346,10 @@ int prom_inst2pkg(int inst) ...@@ -345,9 +346,10 @@ int prom_inst2pkg(int inst)
/* Return 'node' assigned to a particular prom 'path' /* Return 'node' assigned to a particular prom 'path'
* FIXME: Should work for v0 as well * FIXME: Should work for v0 as well
*/ */
int prom_pathtoinode(char *path) phandle prom_pathtoinode(char *path)
{ {
int node, inst; phandle node;
int inst;
inst = prom_devopen (path); inst = prom_devopen (path);
if (inst == -1) return 0; if (inst == -1) return 0;
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
#include <asm/oplib.h> #include <asm/oplib.h>
#include <asm/ldc.h> #include <asm/ldc.h>
static int prom_node_to_node(const char *type, int node) static phandle prom_node_to_node(const char *type, phandle node)
{ {
unsigned long args[5]; unsigned long args[5];
...@@ -28,20 +28,20 @@ static int prom_node_to_node(const char *type, int node) ...@@ -28,20 +28,20 @@ static int prom_node_to_node(const char *type, int node)
p1275_cmd_direct(args); p1275_cmd_direct(args);
return (int) args[4]; return (phandle) args[4];
} }
/* Return the child of node 'node' or zero if no this node has no /* Return the child of node 'node' or zero if no this node has no
* direct descendent. * direct descendent.
*/ */
inline int __prom_getchild(int node) inline phandle __prom_getchild(phandle node)
{ {
return prom_node_to_node("child", node); return prom_node_to_node("child", node);
} }
inline int prom_getchild(int node) inline phandle prom_getchild(phandle node)
{ {
int cnode; phandle cnode;
if (node == -1) if (node == -1)
return 0; return 0;
...@@ -52,9 +52,9 @@ inline int prom_getchild(int node) ...@@ -52,9 +52,9 @@ inline int prom_getchild(int node)
} }
EXPORT_SYMBOL(prom_getchild); EXPORT_SYMBOL(prom_getchild);
inline int prom_getparent(int node) inline phandle prom_getparent(phandle node)
{ {
int cnode; phandle cnode;
if (node == -1) if (node == -1)
return 0; return 0;
...@@ -67,14 +67,14 @@ inline int prom_getparent(int node) ...@@ -67,14 +67,14 @@ inline int prom_getparent(int node)
/* Return the next sibling of node 'node' or zero if no more siblings /* Return the next sibling of node 'node' or zero if no more siblings
* at this level of depth in the tree. * at this level of depth in the tree.
*/ */
inline int __prom_getsibling(int node) inline phandle __prom_getsibling(phandle node)
{ {
return prom_node_to_node(prom_peer_name, node); return prom_node_to_node(prom_peer_name, node);
} }
inline int prom_getsibling(int node) inline phandle prom_getsibling(phandle node)
{ {
int sibnode; phandle sibnode;
if (node == -1) if (node == -1)
return 0; return 0;
...@@ -89,7 +89,7 @@ EXPORT_SYMBOL(prom_getsibling); ...@@ -89,7 +89,7 @@ EXPORT_SYMBOL(prom_getsibling);
/* Return the length in bytes of property 'prop' at node 'node'. /* Return the length in bytes of property 'prop' at node 'node'.
* Return -1 on error. * Return -1 on error.
*/ */
inline int prom_getproplen(int node, const char *prop) inline int prom_getproplen(phandle node, const char *prop)
{ {
unsigned long args[6]; unsigned long args[6];
...@@ -113,7 +113,7 @@ EXPORT_SYMBOL(prom_getproplen); ...@@ -113,7 +113,7 @@ EXPORT_SYMBOL(prom_getproplen);
* 'buffer' which has a size of 'bufsize'. If the acquisition * 'buffer' which has a size of 'bufsize'. If the acquisition
* was successful the length will be returned, else -1 is returned. * was successful the length will be returned, else -1 is returned.
*/ */
inline int prom_getproperty(int node, const char *prop, inline int prom_getproperty(phandle node, const char *prop,
char *buffer, int bufsize) char *buffer, int bufsize)
{ {
unsigned long args[8]; unsigned long args[8];
...@@ -141,7 +141,7 @@ EXPORT_SYMBOL(prom_getproperty); ...@@ -141,7 +141,7 @@ EXPORT_SYMBOL(prom_getproperty);
/* Acquire an integer property and return its value. Returns -1 /* Acquire an integer property and return its value. Returns -1
* on failure. * on failure.
*/ */
inline int prom_getint(int node, const char *prop) inline int prom_getint(phandle node, const char *prop)
{ {
int intprop; int intprop;
...@@ -156,7 +156,7 @@ EXPORT_SYMBOL(prom_getint); ...@@ -156,7 +156,7 @@ EXPORT_SYMBOL(prom_getint);
* integer. * integer.
*/ */
int prom_getintdefault(int node, const char *property, int deflt) int prom_getintdefault(phandle node, const char *property, int deflt)
{ {
int retval; int retval;
...@@ -169,7 +169,7 @@ int prom_getintdefault(int node, const char *property, int deflt) ...@@ -169,7 +169,7 @@ int prom_getintdefault(int node, const char *property, int deflt)
EXPORT_SYMBOL(prom_getintdefault); EXPORT_SYMBOL(prom_getintdefault);
/* Acquire a boolean property, 1=TRUE 0=FALSE. */ /* Acquire a boolean property, 1=TRUE 0=FALSE. */
int prom_getbool(int node, const char *prop) int prom_getbool(phandle node, const char *prop)
{ {
int retval; int retval;
...@@ -184,7 +184,8 @@ EXPORT_SYMBOL(prom_getbool); ...@@ -184,7 +184,8 @@ EXPORT_SYMBOL(prom_getbool);
* string on error. The char pointer is the user supplied string * string on error. The char pointer is the user supplied string
* buffer. * buffer.
*/ */
void prom_getstring(int node, const char *prop, char *user_buf, int ubuf_size) void prom_getstring(phandle node, const char *prop, char *user_buf,
int ubuf_size)
{ {
int len; int len;
...@@ -198,7 +199,7 @@ EXPORT_SYMBOL(prom_getstring); ...@@ -198,7 +199,7 @@ EXPORT_SYMBOL(prom_getstring);
/* Does the device at node 'node' have name 'name'? /* Does the device at node 'node' have name 'name'?
* YES = 1 NO = 0 * YES = 1 NO = 0
*/ */
int prom_nodematch(int node, const char *name) int prom_nodematch(phandle node, const char *name)
{ {
char namebuf[128]; char namebuf[128];
prom_getproperty(node, "name", namebuf, sizeof(namebuf)); prom_getproperty(node, "name", namebuf, sizeof(namebuf));
...@@ -210,10 +211,10 @@ int prom_nodematch(int node, const char *name) ...@@ -210,10 +211,10 @@ int prom_nodematch(int node, const char *name)
/* Search siblings at 'node_start' for a node with name /* Search siblings at 'node_start' for a node with name
* 'nodename'. Return node if successful, zero if not. * 'nodename'. Return node if successful, zero if not.
*/ */
int prom_searchsiblings(int node_start, const char *nodename) phandle prom_searchsiblings(phandle node_start, const char *nodename)
{ {
phandle thisnode;
int thisnode, error; int error;
char promlib_buf[128]; char promlib_buf[128];
for(thisnode = node_start; thisnode; for(thisnode = node_start; thisnode;
...@@ -234,7 +235,7 @@ static const char *prom_nextprop_name = "nextprop"; ...@@ -234,7 +235,7 @@ static const char *prom_nextprop_name = "nextprop";
/* Return the first property type for node 'node'. /* Return the first property type for node 'node'.
* buffer should be at least 32B in length * buffer should be at least 32B in length
*/ */
inline char *prom_firstprop(int node, char *buffer) inline char *prom_firstprop(phandle node, char *buffer)
{ {
unsigned long args[7]; unsigned long args[7];
...@@ -260,7 +261,7 @@ EXPORT_SYMBOL(prom_firstprop); ...@@ -260,7 +261,7 @@ EXPORT_SYMBOL(prom_firstprop);
* at node 'node' . Returns NULL string if no more * at node 'node' . Returns NULL string if no more
* property types for this node. * property types for this node.
*/ */
inline char *prom_nextprop(int node, const char *oprop, char *buffer) inline char *prom_nextprop(phandle node, const char *oprop, char *buffer)
{ {
unsigned long args[7]; unsigned long args[7];
char buf[32]; char buf[32];
...@@ -288,8 +289,7 @@ inline char *prom_nextprop(int node, const char *oprop, char *buffer) ...@@ -288,8 +289,7 @@ inline char *prom_nextprop(int node, const char *oprop, char *buffer)
} }
EXPORT_SYMBOL(prom_nextprop); EXPORT_SYMBOL(prom_nextprop);
int phandle prom_finddevice(const char *name)
prom_finddevice(const char *name)
{ {
unsigned long args[5]; unsigned long args[5];
...@@ -307,7 +307,7 @@ prom_finddevice(const char *name) ...@@ -307,7 +307,7 @@ prom_finddevice(const char *name)
} }
EXPORT_SYMBOL(prom_finddevice); EXPORT_SYMBOL(prom_finddevice);
int prom_node_has_property(int node, const char *prop) int prom_node_has_property(phandle node, const char *prop)
{ {
char buf [32]; char buf [32];
...@@ -325,7 +325,7 @@ EXPORT_SYMBOL(prom_node_has_property); ...@@ -325,7 +325,7 @@ EXPORT_SYMBOL(prom_node_has_property);
* of 'size' bytes. Return the number of bytes the prom accepted. * of 'size' bytes. Return the number of bytes the prom accepted.
*/ */
int int
prom_setprop(int node, const char *pname, char *value, int size) prom_setprop(phandle node, const char *pname, char *value, int size)
{ {
unsigned long args[8]; unsigned long args[8];
...@@ -355,10 +355,10 @@ prom_setprop(int node, const char *pname, char *value, int size) ...@@ -355,10 +355,10 @@ prom_setprop(int node, const char *pname, char *value, int size)
} }
EXPORT_SYMBOL(prom_setprop); EXPORT_SYMBOL(prom_setprop);
inline int prom_inst2pkg(int inst) inline phandle prom_inst2pkg(int inst)
{ {
unsigned long args[5]; unsigned long args[5];
int node; phandle node;
args[0] = (unsigned long) "instance-to-package"; args[0] = (unsigned long) "instance-to-package";
args[1] = 1; args[1] = 1;
...@@ -377,10 +377,10 @@ inline int prom_inst2pkg(int inst) ...@@ -377,10 +377,10 @@ inline int prom_inst2pkg(int inst)
/* Return 'node' assigned to a particular prom 'path' /* Return 'node' assigned to a particular prom 'path'
* FIXME: Should work for v0 as well * FIXME: Should work for v0 as well
*/ */
int phandle prom_pathtoinode(const char *path)
prom_pathtoinode(const char *path)
{ {
int node, inst; phandle node;
int inst;
inst = prom_devopen (path); inst = prom_devopen (path);
if (inst == 0) if (inst == 0)
......
...@@ -147,6 +147,7 @@ static void platform_device_release(struct device *dev) ...@@ -147,6 +147,7 @@ static void platform_device_release(struct device *dev)
struct platform_object *pa = container_of(dev, struct platform_object, struct platform_object *pa = container_of(dev, struct platform_object,
pdev.dev); pdev.dev);
of_device_node_put(&pa->pdev.dev);
kfree(pa->pdev.dev.platform_data); kfree(pa->pdev.dev.platform_data);
kfree(pa->pdev.resource); kfree(pa->pdev.resource);
kfree(pa); kfree(pa);
......
...@@ -1225,7 +1225,8 @@ ace_of_probe(struct platform_device *op, const struct of_device_id *match) ...@@ -1225,7 +1225,8 @@ ace_of_probe(struct platform_device *op, const struct of_device_id *match)
bus_width = ACE_BUS_WIDTH_8; bus_width = ACE_BUS_WIDTH_8;
/* Call the bus-independant setup code */ /* Call the bus-independant setup code */
return ace_alloc(&op->dev, id ? *id : 0, physaddr, irq, bus_width); return ace_alloc(&op->dev, id ? be32_to_cpup(id) : 0,
physaddr, irq, bus_width);
} }
static int __devexit ace_of_remove(struct platform_device *op) static int __devexit ace_of_remove(struct platform_device *op)
......
...@@ -171,13 +171,13 @@ static int __devinit xgpio_of_probe(struct device_node *np) ...@@ -171,13 +171,13 @@ static int __devinit xgpio_of_probe(struct device_node *np)
/* Update GPIO state shadow register with default value */ /* Update GPIO state shadow register with default value */
tree_info = of_get_property(np, "xlnx,dout-default", NULL); tree_info = of_get_property(np, "xlnx,dout-default", NULL);
if (tree_info) if (tree_info)
chip->gpio_state = *tree_info; chip->gpio_state = be32_to_cpup(tree_info);
/* Update GPIO direction shadow register with default value */ /* Update GPIO direction shadow register with default value */
chip->gpio_dir = 0xFFFFFFFF; /* By default, all pins are inputs */ chip->gpio_dir = 0xFFFFFFFF; /* By default, all pins are inputs */
tree_info = of_get_property(np, "xlnx,tri-default", NULL); tree_info = of_get_property(np, "xlnx,tri-default", NULL);
if (tree_info) if (tree_info)
chip->gpio_dir = *tree_info; chip->gpio_dir = be32_to_cpup(tree_info);
/* Check device node and parent device node for device width */ /* Check device node and parent device node for device width */
chip->mmchip.gc.ngpio = 32; /* By default assume full GPIO controller */ chip->mmchip.gc.ngpio = 32; /* By default assume full GPIO controller */
...@@ -186,7 +186,7 @@ static int __devinit xgpio_of_probe(struct device_node *np) ...@@ -186,7 +186,7 @@ static int __devinit xgpio_of_probe(struct device_node *np)
tree_info = of_get_property(np->parent, tree_info = of_get_property(np->parent,
"xlnx,gpio-width", NULL); "xlnx,gpio-width", NULL);
if (tree_info) if (tree_info)
chip->mmchip.gc.ngpio = *tree_info; chip->mmchip.gc.ngpio = be32_to_cpup(tree_info);
spin_lock_init(&chip->gpio_lock); spin_lock_init(&chip->gpio_lock);
......
...@@ -924,6 +924,13 @@ static int __devinit m25p_probe(struct spi_device *spi) ...@@ -924,6 +924,13 @@ static int __devinit m25p_probe(struct spi_device *spi)
nr_parts = data->nr_parts; nr_parts = data->nr_parts;
} }
#ifdef CONFIG_OF
if (nr_parts <= 0 && spi->dev.of_node) {
nr_parts = of_mtd_parse_partitions(&spi->dev,
spi->dev.of_node, &parts);
}
#endif
if (nr_parts > 0) { if (nr_parts > 0) {
for (i = 0; i < nr_parts; i++) { for (i = 0; i < nr_parts; i++) {
DEBUG(MTD_DEBUG_LEVEL2, "partitions[%d] = " DEBUG(MTD_DEBUG_LEVEL2, "partitions[%d] = "
......
...@@ -294,7 +294,7 @@ static int __devinit of_flash_probe(struct platform_device *dev, ...@@ -294,7 +294,7 @@ static int __devinit of_flash_probe(struct platform_device *dev,
info->list[i].map.name = dev_name(&dev->dev); info->list[i].map.name = dev_name(&dev->dev);
info->list[i].map.phys = res.start; info->list[i].map.phys = res.start;
info->list[i].map.size = res_size; info->list[i].map.size = res_size;
info->list[i].map.bankwidth = *width; info->list[i].map.bankwidth = be32_to_cpup(width);
err = -ENOMEM; err = -ENOMEM;
info->list[i].map.virt = ioremap(info->list[i].map.phys, info->list[i].map.virt = ioremap(info->list[i].map.phys,
......
...@@ -53,8 +53,8 @@ int __devinit of_mtd_parse_partitions(struct device *dev, ...@@ -53,8 +53,8 @@ int __devinit of_mtd_parse_partitions(struct device *dev,
continue; continue;
} }
(*pparts)[i].offset = reg[0]; (*pparts)[i].offset = be32_to_cpu(reg[0]);
(*pparts)[i].size = reg[1]; (*pparts)[i].size = be32_to_cpu(reg[1]);
partname = of_get_property(pp, "label", &len); partname = of_get_property(pp, "label", &len);
if (!partname) if (!partname)
......
...@@ -4,7 +4,7 @@ config DTC ...@@ -4,7 +4,7 @@ config DTC
config OF config OF
bool bool
menu "Flattened Device Tree and Open Firmware support" menu "Device Tree and Open Firmware support"
depends on OF depends on OF
config PROC_DEVICETREE config PROC_DEVICETREE
...@@ -19,6 +19,9 @@ config OF_FLATTREE ...@@ -19,6 +19,9 @@ config OF_FLATTREE
bool bool
select DTC select DTC
config OF_PROMTREE
bool
config OF_DYNAMIC config OF_DYNAMIC
def_bool y def_bool y
depends on PPC_OF depends on PPC_OF
......
obj-y = base.o obj-y = base.o
obj-$(CONFIG_OF_FLATTREE) += fdt.o obj-$(CONFIG_OF_FLATTREE) += fdt.o
obj-$(CONFIG_OF_PROMTREE) += pdt.o
obj-$(CONFIG_OF_ADDRESS) += address.o obj-$(CONFIG_OF_ADDRESS) += address.o
obj-$(CONFIG_OF_IRQ) += irq.o obj-$(CONFIG_OF_IRQ) += irq.o
obj-$(CONFIG_OF_DEVICE) += device.o platform.o obj-$(CONFIG_OF_DEVICE) += device.o platform.o
......
...@@ -163,7 +163,7 @@ static int of_bus_pci_translate(u32 *addr, u64 offset, int na) ...@@ -163,7 +163,7 @@ static int of_bus_pci_translate(u32 *addr, u64 offset, int na)
const u32 *of_get_pci_address(struct device_node *dev, int bar_no, u64 *size, const u32 *of_get_pci_address(struct device_node *dev, int bar_no, u64 *size,
unsigned int *flags) unsigned int *flags)
{ {
const u32 *prop; const __be32 *prop;
unsigned int psize; unsigned int psize;
struct device_node *parent; struct device_node *parent;
struct of_bus *bus; struct of_bus *bus;
......
...@@ -33,7 +33,7 @@ DEFINE_RWLOCK(devtree_lock); ...@@ -33,7 +33,7 @@ DEFINE_RWLOCK(devtree_lock);
int of_n_addr_cells(struct device_node *np) int of_n_addr_cells(struct device_node *np)
{ {
const int *ip; const __be32 *ip;
do { do {
if (np->parent) if (np->parent)
...@@ -49,7 +49,7 @@ EXPORT_SYMBOL(of_n_addr_cells); ...@@ -49,7 +49,7 @@ EXPORT_SYMBOL(of_n_addr_cells);
int of_n_size_cells(struct device_node *np) int of_n_size_cells(struct device_node *np)
{ {
const int *ip; const __be32 *ip;
do { do {
if (np->parent) if (np->parent)
......
...@@ -81,29 +81,10 @@ struct device_attribute of_platform_device_attrs[] = { ...@@ -81,29 +81,10 @@ struct device_attribute of_platform_device_attrs[] = {
__ATTR_NULL __ATTR_NULL
}; };
/** int of_device_add(struct platform_device *ofdev)
* of_release_dev - free an of device structure when all users of it are finished.
* @dev: device that's been disconnected
*
* Will be called only by the device core when all users of this of device are
* done.
*/
void of_release_dev(struct device *dev)
{
struct platform_device *ofdev;
ofdev = to_platform_device(dev);
of_node_put(ofdev->dev.of_node);
kfree(ofdev);
}
EXPORT_SYMBOL(of_release_dev);
int of_device_register(struct platform_device *ofdev)
{ {
BUG_ON(ofdev->dev.of_node == NULL); BUG_ON(ofdev->dev.of_node == NULL);
device_initialize(&ofdev->dev);
/* name and id have to be set so that the platform bus doesn't get /* name and id have to be set so that the platform bus doesn't get
* confused on matching */ * confused on matching */
ofdev->name = dev_name(&ofdev->dev); ofdev->name = dev_name(&ofdev->dev);
...@@ -117,6 +98,12 @@ int of_device_register(struct platform_device *ofdev) ...@@ -117,6 +98,12 @@ int of_device_register(struct platform_device *ofdev)
return device_add(&ofdev->dev); return device_add(&ofdev->dev);
} }
int of_device_register(struct platform_device *pdev)
{
device_initialize(&pdev->dev);
return of_device_add(pdev);
}
EXPORT_SYMBOL(of_device_register); EXPORT_SYMBOL(of_device_register);
void of_device_unregister(struct platform_device *ofdev) void of_device_unregister(struct platform_device *ofdev)
......
...@@ -533,8 +533,6 @@ int __init early_init_dt_scan_chosen(unsigned long node, const char *uname, ...@@ -533,8 +533,6 @@ int __init early_init_dt_scan_chosen(unsigned long node, const char *uname,
strlcpy(cmd_line, CONFIG_CMDLINE, COMMAND_LINE_SIZE); strlcpy(cmd_line, CONFIG_CMDLINE, COMMAND_LINE_SIZE);
#endif /* CONFIG_CMDLINE */ #endif /* CONFIG_CMDLINE */
early_init_dt_scan_chosen_arch(node);
pr_debug("Command line is: %s\n", cmd_line); pr_debug("Command line is: %s\n", cmd_line);
/* break now */ /* break now */
......
...@@ -24,6 +24,11 @@ ...@@ -24,6 +24,11 @@
#include <linux/of_irq.h> #include <linux/of_irq.h>
#include <linux/string.h> #include <linux/string.h>
/* For archs that don't support NO_IRQ (such as x86), provide a dummy value */
#ifndef NO_IRQ
#define NO_IRQ 0
#endif
/** /**
* irq_of_parse_and_map - Parse and map an interrupt into linux virq space * irq_of_parse_and_map - Parse and map an interrupt into linux virq space
* @device: Device node of the device whose interrupt is to be mapped * @device: Device node of the device whose interrupt is to be mapped
...@@ -347,3 +352,37 @@ int of_irq_to_resource(struct device_node *dev, int index, struct resource *r) ...@@ -347,3 +352,37 @@ int of_irq_to_resource(struct device_node *dev, int index, struct resource *r)
return irq; return irq;
} }
EXPORT_SYMBOL_GPL(of_irq_to_resource); EXPORT_SYMBOL_GPL(of_irq_to_resource);
/**
* of_irq_count - Count the number of IRQs a node uses
* @dev: pointer to device tree node
*/
int of_irq_count(struct device_node *dev)
{
int nr = 0;
while (of_irq_to_resource(dev, nr, NULL) != NO_IRQ)
nr++;
return nr;
}
/**
* of_irq_to_resource_table - Fill in resource table with node's IRQ info
* @dev: pointer to device tree node
* @res: array of resources to fill in
* @nr_irqs: the number of IRQs (and upper bound for num of @res elements)
*
* Returns the size of the filled in table (up to @nr_irqs).
*/
int of_irq_to_resource_table(struct device_node *dev, struct resource *res,
int nr_irqs)
{
int i;
for (i = 0; i < nr_irqs; i++, res++)
if (of_irq_to_resource(dev, i, res) == NO_IRQ)
break;
return i;
}
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
*/ */
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/irq.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_i2c.h> #include <linux/of_i2c.h>
#include <linux/of_irq.h> #include <linux/of_irq.h>
......
/* pdt.c: OF PROM device tree support code.
*
* Paul Mackerras August 1996.
* Copyright (C) 1996-2005 Paul Mackerras.
*
* Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner.
* {engebret|bergner}@us.ibm.com
*
* Adapted for sparc by David S. Miller davem@davemloft.net
* Adapted for multiple architectures by Andres Salomon <dilinger@queued.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/mutex.h>
#include <linux/slab.h>
#include <linux/of.h>
#include <linux/of_pdt.h>
#include <asm/prom.h>
static struct of_pdt_ops *of_pdt_prom_ops __initdata;
void __initdata (*of_pdt_build_more)(struct device_node *dp,
struct device_node ***nextp);
#if defined(CONFIG_SPARC)
unsigned int of_pdt_unique_id __initdata;
#define of_pdt_incr_unique_id(p) do { \
(p)->unique_id = of_pdt_unique_id++; \
} while (0)
static inline const char *of_pdt_node_name(struct device_node *dp)
{
return dp->path_component_name;
}
#else
static inline void of_pdt_incr_unique_id(void *p) { }
static inline void irq_trans_init(struct device_node *dp) { }
static inline const char *of_pdt_node_name(struct device_node *dp)
{
return dp->name;
}
#endif /* !CONFIG_SPARC */
static struct property * __init of_pdt_build_one_prop(phandle node, char *prev,
char *special_name,
void *special_val,
int special_len)
{
static struct property *tmp = NULL;
struct property *p;
int err;
if (tmp) {
p = tmp;
memset(p, 0, sizeof(*p) + 32);
tmp = NULL;
} else {
p = prom_early_alloc(sizeof(struct property) + 32);
of_pdt_incr_unique_id(p);
}
p->name = (char *) (p + 1);
if (special_name) {
strcpy(p->name, special_name);
p->length = special_len;
p->value = prom_early_alloc(special_len);
memcpy(p->value, special_val, special_len);
} else {
err = of_pdt_prom_ops->nextprop(node, prev, p->name);
if (err) {
tmp = p;
return NULL;
}
p->length = of_pdt_prom_ops->getproplen(node, p->name);
if (p->length <= 0) {
p->length = 0;
} else {
int len;
p->value = prom_early_alloc(p->length + 1);
len = of_pdt_prom_ops->getproperty(node, p->name,
p->value, p->length);
if (len <= 0)
p->length = 0;
((unsigned char *)p->value)[p->length] = '\0';
}
}
return p;
}
static struct property * __init of_pdt_build_prop_list(phandle node)
{
struct property *head, *tail;
head = tail = of_pdt_build_one_prop(node, NULL,
".node", &node, sizeof(node));
tail->next = of_pdt_build_one_prop(node, NULL, NULL, NULL, 0);
tail = tail->next;
while(tail) {
tail->next = of_pdt_build_one_prop(node, tail->name,
NULL, NULL, 0);
tail = tail->next;
}
return head;
}
static char * __init of_pdt_get_one_property(phandle node, const char *name)
{
char *buf = "<NULL>";
int len;
len = of_pdt_prom_ops->getproplen(node, name);
if (len > 0) {
buf = prom_early_alloc(len);
len = of_pdt_prom_ops->getproperty(node, name, buf, len);
}
return buf;
}
static char * __init of_pdt_try_pkg2path(phandle node)
{
char *res, *buf = NULL;
int len;
if (!of_pdt_prom_ops->pkg2path)
return NULL;
if (of_pdt_prom_ops->pkg2path(node, buf, 0, &len))
return NULL;
buf = prom_early_alloc(len + 1);
if (of_pdt_prom_ops->pkg2path(node, buf, len, &len)) {
pr_err("%s: package-to-path failed\n", __func__);
return NULL;
}
res = strrchr(buf, '/');
if (!res) {
pr_err("%s: couldn't find / in %s\n", __func__, buf);
return NULL;
}
return res+1;
}
/*
* When fetching the node's name, first try using package-to-path; if
* that fails (either because the arch hasn't supplied a PROM callback,
* or some other random failure), fall back to just looking at the node's
* 'name' property.
*/
static char * __init of_pdt_build_name(phandle node)
{
char *buf;
buf = of_pdt_try_pkg2path(node);
if (!buf)
buf = of_pdt_get_one_property(node, "name");
return buf;
}
static struct device_node * __init of_pdt_create_node(phandle node,
struct device_node *parent)
{
struct device_node *dp;
if (!node)
return NULL;
dp = prom_early_alloc(sizeof(*dp));
of_pdt_incr_unique_id(dp);
dp->parent = parent;
kref_init(&dp->kref);
dp->name = of_pdt_build_name(node);
dp->type = of_pdt_get_one_property(node, "device_type");
dp->phandle = node;
dp->properties = of_pdt_build_prop_list(node);
irq_trans_init(dp);
return dp;
}
static char * __init of_pdt_build_full_name(struct device_node *dp)
{
int len, ourlen, plen;
char *n;
plen = strlen(dp->parent->full_name);
ourlen = strlen(of_pdt_node_name(dp));
len = ourlen + plen + 2;
n = prom_early_alloc(len);
strcpy(n, dp->parent->full_name);
if (!of_node_is_root(dp->parent)) {
strcpy(n + plen, "/");
plen++;
}
strcpy(n + plen, of_pdt_node_name(dp));
return n;
}
static struct device_node * __init of_pdt_build_tree(struct device_node *parent,
phandle node,
struct device_node ***nextp)
{
struct device_node *ret = NULL, *prev_sibling = NULL;
struct device_node *dp;
while (1) {
dp = of_pdt_create_node(node, parent);
if (!dp)
break;
if (prev_sibling)
prev_sibling->sibling = dp;
if (!ret)
ret = dp;
prev_sibling = dp;
*(*nextp) = dp;
*nextp = &dp->allnext;
#if defined(CONFIG_SPARC)
dp->path_component_name = build_path_component(dp);
#endif
dp->full_name = of_pdt_build_full_name(dp);
dp->child = of_pdt_build_tree(dp,
of_pdt_prom_ops->getchild(node), nextp);
if (of_pdt_build_more)
of_pdt_build_more(dp, nextp);
node = of_pdt_prom_ops->getsibling(node);
}
return ret;
}
void __init of_pdt_build_devicetree(phandle root_node, struct of_pdt_ops *ops)
{
struct device_node **nextp;
BUG_ON(!ops);
of_pdt_prom_ops = ops;
allnodes = of_pdt_create_node(root_node, NULL);
#if defined(CONFIG_SPARC)
allnodes->path_component_name = "";
#endif
allnodes->full_name = "/";
nextp = &allnodes->allnext;
allnodes->child = of_pdt_build_tree(allnodes,
of_pdt_prom_ops->getchild(allnodes->phandle), &nextp);
}
...@@ -584,34 +584,33 @@ struct platform_device *of_device_alloc(struct device_node *np, ...@@ -584,34 +584,33 @@ struct platform_device *of_device_alloc(struct device_node *np,
struct device *parent) struct device *parent)
{ {
struct platform_device *dev; struct platform_device *dev;
int rc, i, num_reg = 0, num_irq = 0; int rc, i, num_reg = 0, num_irq;
struct resource *res, temp_res; struct resource *res, temp_res;
/* First count how many resources are needed */ dev = platform_device_alloc("", -1);
while (of_address_to_resource(np, num_reg, &temp_res) == 0)
num_reg++;
while (of_irq_to_resource(np, num_irq, &temp_res) != NO_IRQ)
num_irq++;
/* Allocate memory for both the struct device and the resource table */
dev = kzalloc(sizeof(*dev) + (sizeof(*res) * (num_reg + num_irq)),
GFP_KERNEL);
if (!dev) if (!dev)
return NULL; return NULL;
res = (struct resource *) &dev[1];
/* count the io and irq resources */
while (of_address_to_resource(np, num_reg, &temp_res) == 0)
num_reg++;
num_irq = of_irq_count(np);
/* Populate the resource table */ /* Populate the resource table */
if (num_irq || num_reg) { if (num_irq || num_reg) {
res = kzalloc(sizeof(*res) * (num_irq + num_reg), GFP_KERNEL);
if (!res) {
platform_device_put(dev);
return NULL;
}
dev->num_resources = num_reg + num_irq; dev->num_resources = num_reg + num_irq;
dev->resource = res; dev->resource = res;
for (i = 0; i < num_reg; i++, res++) { for (i = 0; i < num_reg; i++, res++) {
rc = of_address_to_resource(np, i, res); rc = of_address_to_resource(np, i, res);
WARN_ON(rc); WARN_ON(rc);
} }
for (i = 0; i < num_irq; i++, res++) { WARN_ON(of_irq_to_resource_table(np, res, num_irq) != num_irq);
rc = of_irq_to_resource(np, i, res);
WARN_ON(rc == NO_IRQ);
}
} }
dev->dev.of_node = of_node_get(np); dev->dev.of_node = of_node_get(np);
...@@ -619,7 +618,6 @@ struct platform_device *of_device_alloc(struct device_node *np, ...@@ -619,7 +618,6 @@ struct platform_device *of_device_alloc(struct device_node *np,
dev->dev.dma_mask = &dev->archdata.dma_mask; dev->dev.dma_mask = &dev->archdata.dma_mask;
#endif #endif
dev->dev.parent = parent; dev->dev.parent = parent;
dev->dev.release = of_release_dev;
if (bus_id) if (bus_id)
dev_set_name(&dev->dev, "%s", bus_id); dev_set_name(&dev->dev, "%s", bus_id);
...@@ -657,8 +655,8 @@ struct platform_device *of_platform_device_create(struct device_node *np, ...@@ -657,8 +655,8 @@ struct platform_device *of_platform_device_create(struct device_node *np,
* to do such, possibly using a device notifier * to do such, possibly using a device notifier
*/ */
if (of_device_register(dev) != 0) { if (of_device_add(dev) != 0) {
of_device_free(dev); platform_device_put(dev);
return NULL; return NULL;
} }
......
...@@ -461,7 +461,7 @@ static int jsflash_init(void) ...@@ -461,7 +461,7 @@ static int jsflash_init(void)
{ {
int rc; int rc;
struct jsflash *jsf; struct jsflash *jsf;
int node; phandle node;
char banner[128]; char banner[128];
struct linux_prom_registers reg0; struct linux_prom_registers reg0;
......
...@@ -31,8 +31,8 @@ static int __devinit of_platform_serial_setup(struct platform_device *ofdev, ...@@ -31,8 +31,8 @@ static int __devinit of_platform_serial_setup(struct platform_device *ofdev,
{ {
struct resource resource; struct resource resource;
struct device_node *np = ofdev->dev.of_node; struct device_node *np = ofdev->dev.of_node;
const unsigned int *clk, *spd; const __be32 *clk, *spd;
const u32 *prop; const __be32 *prop;
int ret, prop_size; int ret, prop_size;
memset(port, 0, sizeof *port); memset(port, 0, sizeof *port);
...@@ -55,23 +55,23 @@ static int __devinit of_platform_serial_setup(struct platform_device *ofdev, ...@@ -55,23 +55,23 @@ static int __devinit of_platform_serial_setup(struct platform_device *ofdev,
/* Check for shifted address mapping */ /* Check for shifted address mapping */
prop = of_get_property(np, "reg-offset", &prop_size); prop = of_get_property(np, "reg-offset", &prop_size);
if (prop && (prop_size == sizeof(u32))) if (prop && (prop_size == sizeof(u32)))
port->mapbase += *prop; port->mapbase += be32_to_cpup(prop);
/* Check for registers offset within the devices address range */ /* Check for registers offset within the devices address range */
prop = of_get_property(np, "reg-shift", &prop_size); prop = of_get_property(np, "reg-shift", &prop_size);
if (prop && (prop_size == sizeof(u32))) if (prop && (prop_size == sizeof(u32)))
port->regshift = *prop; port->regshift = be32_to_cpup(prop);
port->irq = irq_of_parse_and_map(np, 0); port->irq = irq_of_parse_and_map(np, 0);
port->iotype = UPIO_MEM; port->iotype = UPIO_MEM;
port->type = type; port->type = type;
port->uartclk = *clk; port->uartclk = be32_to_cpup(clk);
port->flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP port->flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP
| UPF_FIXED_PORT | UPF_FIXED_TYPE; | UPF_FIXED_PORT | UPF_FIXED_TYPE;
port->dev = &ofdev->dev; port->dev = &ofdev->dev;
/* If current-speed was set, then try not to change it. */ /* If current-speed was set, then try not to change it. */
if (spd) if (spd)
port->custom_divisor = *clk / (16 * (*spd)); port->custom_divisor = be32_to_cpup(clk) / (16 * (be32_to_cpup(spd)));
return 0; return 0;
} }
......
...@@ -2970,7 +2970,8 @@ static int __devinit atyfb_setup_sparc(struct pci_dev *pdev, ...@@ -2970,7 +2970,8 @@ static int __devinit atyfb_setup_sparc(struct pci_dev *pdev,
struct atyfb_par *par = info->par; struct atyfb_par *par = info->par;
struct device_node *dp; struct device_node *dp;
char prop[128]; char prop[128];
int node, len, i, j, ret; phandle node;
int len, i, j, ret;
u32 mem, chip_id; u32 mem, chip_id;
/* /*
......
...@@ -27,20 +27,19 @@ static inline int of_driver_match_device(const struct device *dev, ...@@ -27,20 +27,19 @@ static inline int of_driver_match_device(const struct device *dev,
extern struct platform_device *of_dev_get(struct platform_device *dev); extern struct platform_device *of_dev_get(struct platform_device *dev);
extern void of_dev_put(struct platform_device *dev); extern void of_dev_put(struct platform_device *dev);
extern int of_device_add(struct platform_device *pdev);
extern int of_device_register(struct platform_device *ofdev); extern int of_device_register(struct platform_device *ofdev);
extern void of_device_unregister(struct platform_device *ofdev); extern void of_device_unregister(struct platform_device *ofdev);
extern void of_release_dev(struct device *dev);
static inline void of_device_free(struct platform_device *dev)
{
of_release_dev(&dev->dev);
}
extern ssize_t of_device_get_modalias(struct device *dev, extern ssize_t of_device_get_modalias(struct device *dev,
char *str, ssize_t len); char *str, ssize_t len);
extern int of_device_uevent(struct device *dev, struct kobj_uevent_env *env); extern int of_device_uevent(struct device *dev, struct kobj_uevent_env *env);
static inline void of_device_node_put(struct device *dev)
{
of_node_put(dev->of_node);
}
#else /* CONFIG_OF_DEVICE */ #else /* CONFIG_OF_DEVICE */
...@@ -56,6 +55,8 @@ static inline int of_device_uevent(struct device *dev, ...@@ -56,6 +55,8 @@ static inline int of_device_uevent(struct device *dev,
return -ENODEV; return -ENODEV;
} }
static inline void of_device_node_put(struct device *dev) { }
#endif /* CONFIG_OF_DEVICE */ #endif /* CONFIG_OF_DEVICE */
#endif /* _LINUX_OF_DEVICE_H */ #endif /* _LINUX_OF_DEVICE_H */
...@@ -72,7 +72,7 @@ extern void *of_get_flat_dt_prop(unsigned long node, const char *name, ...@@ -72,7 +72,7 @@ extern void *of_get_flat_dt_prop(unsigned long node, const char *name,
unsigned long *size); unsigned long *size);
extern int of_flat_dt_is_compatible(unsigned long node, const char *name); extern int of_flat_dt_is_compatible(unsigned long node, const char *name);
extern unsigned long of_get_flat_dt_root(void); extern unsigned long of_get_flat_dt_root(void);
extern void early_init_dt_scan_chosen_arch(unsigned long node);
extern int early_init_dt_scan_chosen(unsigned long node, const char *uname, extern int early_init_dt_scan_chosen(unsigned long node, const char *uname,
int depth, void *data); int depth, void *data);
extern void early_init_dt_check_for_initrd(unsigned long node); extern void early_init_dt_check_for_initrd(unsigned long node);
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
struct of_irq; struct of_irq;
#include <linux/types.h> #include <linux/types.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/irq.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/of.h> #include <linux/of.h>
...@@ -64,6 +65,9 @@ extern unsigned int irq_create_of_mapping(struct device_node *controller, ...@@ -64,6 +65,9 @@ extern unsigned int irq_create_of_mapping(struct device_node *controller,
unsigned int intsize); unsigned int intsize);
extern int of_irq_to_resource(struct device_node *dev, int index, extern int of_irq_to_resource(struct device_node *dev, int index,
struct resource *r); struct resource *r);
extern int of_irq_count(struct device_node *dev);
extern int of_irq_to_resource_table(struct device_node *dev,
struct resource *res, int nr_irqs);
#endif /* CONFIG_OF_IRQ */ #endif /* CONFIG_OF_IRQ */
#endif /* CONFIG_OF */ #endif /* CONFIG_OF */
......
/*
* Definitions for building a device tree by calling into the
* Open Firmware PROM.
*
* Copyright (C) 2010 Andres Salomon <dilinger@queued.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#ifndef _LINUX_OF_PDT_H
#define _LINUX_OF_PDT_H
/* overridable operations for calling into the PROM */
struct of_pdt_ops {
/*
* buf should be 32 bytes; return 0 on success.
* If prev is NULL, the first property will be returned.
*/
int (*nextprop)(phandle node, char *prev, char *buf);
/* for both functions, return proplen on success; -1 on error */
int (*getproplen)(phandle node, const char *prop);
int (*getproperty)(phandle node, const char *prop, char *buf,
int bufsize);
/* phandles are 0 if no child or sibling exists */
phandle (*getchild)(phandle parent);
phandle (*getsibling)(phandle node);
/* return 0 on success; fill in 'len' with number of bytes in path */
int (*pkg2path)(phandle node, char *buf, const int buflen, int *len);
};
extern void *prom_early_alloc(unsigned long size);
/* for building the device tree */
extern void of_pdt_build_devicetree(phandle root_node, struct of_pdt_ops *ops);
extern void (*of_pdt_build_more)(struct device_node *dp,
struct device_node ***nextp);
#endif /* _LINUX_OF_PDT_H */
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