Merge branch 'next-devicetree' of git://git.secretlab.ca/git/linux-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 5 Aug 2010 22:57:35 +0000 (15:57 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 5 Aug 2010 22:57:35 +0000 (15:57 -0700)
* 'next-devicetree' of git://git.secretlab.ca/git/linux-2.6: (63 commits)
  of/platform: Register of_platform_drivers with an "of:" prefix
  of/address: Clean up function declarations
  of/spi: call of_register_spi_devices() from spi core code
  of: Provide default of_node_to_nid() implementation.
  of/device: Make of_device_make_bus_id() usable by other code.
  of/irq: Fix endian issues in parsing interrupt specifiers
  of: Fix phandle endian issues
  of/flattree: fix of_flat_dt_is_compatible() to match the full compatible string
  of: remove of_default_bus_ids
  of: make of_find_device_by_node generic
  microblaze: remove references to of_device and to_of_device
  sparc: remove references to of_device and to_of_device
  powerpc: remove references to of_device and to_of_device
  of/device: Replace of_device with platform_device in includes and core code
  of/device: Protect against binding of_platform_drivers to non-OF devices
  of: remove asm/of_device.h
  of: remove asm/of_platform.h
  of/platform: remove all of_bus_type and of_platform_bus_type references
  of: Merge of_platform_bus_type with platform_bus_type
  drivercore/of: Add OF style matching to platform bus
  ...

Fix up trivial conflicts in arch/microblaze/kernel/Makefile due to just
some obj-y removals by the devicetree branch, while the microblaze
updates added a new file.

190 files changed:
arch/microblaze/Kconfig
arch/microblaze/include/asm/irq.h
arch/microblaze/include/asm/of_device.h [deleted file]
arch/microblaze/include/asm/of_platform.h [deleted file]
arch/microblaze/include/asm/page.h
arch/microblaze/include/asm/pci-bridge.h
arch/microblaze/include/asm/prom.h
arch/microblaze/include/asm/topology.h
arch/microblaze/kernel/Makefile
arch/microblaze/kernel/irq.c
arch/microblaze/kernel/of_device.c [deleted file]
arch/microblaze/kernel/of_platform.c [deleted file]
arch/microblaze/kernel/prom_parse.c
arch/microblaze/kernel/reset.c
arch/microblaze/kernel/setup.c
arch/powerpc/Kconfig
arch/powerpc/include/asm/irq.h
arch/powerpc/include/asm/macio.h
arch/powerpc/include/asm/of_device.h [deleted file]
arch/powerpc/include/asm/of_platform.h [deleted file]
arch/powerpc/include/asm/pci-bridge.h
arch/powerpc/include/asm/prom.h
arch/powerpc/include/asm/smu.h
arch/powerpc/include/asm/topology.h
arch/powerpc/kernel/Makefile
arch/powerpc/kernel/dma-swiotlb.c
arch/powerpc/kernel/ibmebus.c
arch/powerpc/kernel/irq.c
arch/powerpc/kernel/legacy_serial.c
arch/powerpc/kernel/of_device.c [deleted file]
arch/powerpc/kernel/of_platform.c
arch/powerpc/kernel/pci-common.c
arch/powerpc/kernel/prom_parse.c
arch/powerpc/kernel/setup-common.c
arch/powerpc/platforms/512x/clock.c
arch/powerpc/platforms/52xx/lite5200.c
arch/powerpc/platforms/52xx/mpc52xx_gpio.c
arch/powerpc/platforms/52xx/mpc52xx_gpt.c
arch/powerpc/platforms/52xx/mpc52xx_lpbfifo.c
arch/powerpc/platforms/82xx/ep8248e.c
arch/powerpc/platforms/83xx/mcu_mpc8349emitx.c
arch/powerpc/platforms/83xx/suspend.c
arch/powerpc/platforms/86xx/gef_gpio.c
arch/powerpc/platforms/amigaone/setup.c
arch/powerpc/platforms/cell/axon_msi.c
arch/powerpc/platforms/cell/beat_iommu.c
arch/powerpc/platforms/cell/iommu.c
arch/powerpc/platforms/cell/qpace_setup.c
arch/powerpc/platforms/cell/setup.c
arch/powerpc/platforms/iseries/mf.c
arch/powerpc/platforms/pasemi/gpio_mdio.c
arch/powerpc/platforms/powermac/feature.c
arch/powerpc/platforms/powermac/pic.c
arch/powerpc/sysdev/axonram.c
arch/powerpc/sysdev/bestcomm/bestcomm.c
arch/powerpc/sysdev/bestcomm/sram.c
arch/powerpc/sysdev/cpm1.c
arch/powerpc/sysdev/cpm_common.c
arch/powerpc/sysdev/fsl_gtm.c
arch/powerpc/sysdev/fsl_msi.c
arch/powerpc/sysdev/fsl_pmc.c
arch/powerpc/sysdev/fsl_rio.c
arch/powerpc/sysdev/mpc8xxx_gpio.c
arch/powerpc/sysdev/mv64x60_dev.c
arch/powerpc/sysdev/pmi.c
arch/powerpc/sysdev/ppc4xx_gpio.c
arch/powerpc/sysdev/qe_lib/gpio.c
arch/powerpc/sysdev/qe_lib/qe.c
arch/powerpc/sysdev/simple_gpio.c
arch/sparc/Kconfig
arch/sparc/include/asm/device.h
arch/sparc/include/asm/floppy_64.h
arch/sparc/include/asm/of_device.h [deleted file]
arch/sparc/include/asm/of_platform.h [deleted file]
arch/sparc/include/asm/parport.h
arch/sparc/include/asm/prom.h
arch/sparc/kernel/apc.c
arch/sparc/kernel/auxio_64.c
arch/sparc/kernel/central.c
arch/sparc/kernel/chmc.c
arch/sparc/kernel/ioport.c
arch/sparc/kernel/of_device_32.c
arch/sparc/kernel/of_device_64.c
arch/sparc/kernel/of_device_common.c
arch/sparc/kernel/pci.c
arch/sparc/kernel/pci_fire.c
arch/sparc/kernel/pci_impl.h
arch/sparc/kernel/pci_psycho.c
arch/sparc/kernel/pci_sabre.c
arch/sparc/kernel/pci_schizo.c
arch/sparc/kernel/pci_sun4v.c
arch/sparc/kernel/pmc.c
arch/sparc/kernel/power.c
arch/sparc/kernel/prom.h
arch/sparc/kernel/prom_64.c
arch/sparc/kernel/prom_common.c
arch/sparc/kernel/prom_irqtrans.c
arch/sparc/kernel/psycho_common.c
arch/sparc/kernel/psycho_common.h
arch/sparc/kernel/sbus.c
arch/sparc/kernel/time_32.c
arch/sparc/kernel/time_64.c
arch/sparc/mm/io-unit.c
arch/sparc/mm/iommu.c
drivers/atm/fore200e.c
drivers/base/platform.c
drivers/char/bsr.c
drivers/char/hw_random/n2-drv.c
drivers/crypto/n2_core.c
drivers/gpio/gpiolib.c
drivers/gpio/xilinx_gpio.c
drivers/hwmon/ultra45_env.c
drivers/i2c/busses/i2c-cpm.c
drivers/i2c/busses/i2c-ibm_iic.c
drivers/i2c/busses/i2c-mpc.c
drivers/i2c/i2c-core.c
drivers/input/misc/sparcspkr.c
drivers/input/serio/i8042-sparcio.h
drivers/macintosh/macio_sysfs.c
drivers/mmc/host/mmc_spi.c
drivers/mtd/maps/sun_uflash.c
drivers/net/fsl_pq_mdio.c
drivers/net/ibm_newemac/core.c
drivers/net/myri_sbus.c
drivers/net/niu.c
drivers/net/niu.h
drivers/net/sunbmac.c
drivers/net/sunhme.c
drivers/net/sunlance.c
drivers/net/sunqe.c
drivers/net/xilinx_emaclite.c
drivers/of/Kconfig
drivers/of/Makefile
drivers/of/address.c [new file with mode: 0644]
drivers/of/base.c
drivers/of/device.c
drivers/of/fdt.c
drivers/of/gpio.c
drivers/of/irq.c [new file with mode: 0644]
drivers/of/of_i2c.c
drivers/of/of_mdio.c
drivers/of/of_spi.c
drivers/of/platform.c
drivers/parport/parport_sunbpp.c
drivers/sbus/char/bbc_i2c.c
drivers/sbus/char/display7seg.c
drivers/sbus/char/envctrl.c
drivers/sbus/char/flash.c
drivers/sbus/char/uctrl.c
drivers/scsi/qlogicpti.c
drivers/scsi/sun_esp.c
drivers/serial/sunhv.c
drivers/serial/sunsab.c
drivers/serial/sunsu.c
drivers/serial/sunzilog.c
drivers/serial/uartlite.c
drivers/spi/mpc512x_psc_spi.c
drivers/spi/mpc52xx_psc_spi.c
drivers/spi/mpc52xx_spi.c
drivers/spi/spi.c
drivers/spi/spi_mpc8xxx.c
drivers/spi/spi_ppc4xx.c
drivers/spi/xilinx_spi.c
drivers/spi/xilinx_spi_of.c
drivers/usb/gadget/fsl_qe_udc.c
drivers/video/bw2.c
drivers/video/cg14.c
drivers/video/cg3.c
drivers/video/cg6.c
drivers/video/controlfb.c
drivers/video/ffb.c
drivers/video/leo.c
drivers/video/offb.c
drivers/video/p9100.c
drivers/video/sunxvr1000.c
drivers/video/tcx.c
drivers/watchdog/cpwd.c
drivers/watchdog/riowd.c
include/asm-generic/gpio.h
include/linux/of.h
include/linux/of_address.h [new file with mode: 0644]
include/linux/of_device.h
include/linux/of_gpio.h
include/linux/of_i2c.h
include/linux/of_irq.h [new file with mode: 0644]
include/linux/of_platform.h
include/linux/of_spi.h
sound/sparc/amd7930.c
sound/sparc/cs4231.c
sound/sparc/dbri.c

index be3855250db65625f68019449db839fbbc895e76..9bd64b4b2b0c564fefd26d8d87937d8244d29e7c 100644 (file)
@@ -18,6 +18,8 @@ config MICROBLAZE
        select HAVE_DMA_ATTRS
        select HAVE_DMA_API_DEBUG
        select TRACING_SUPPORT
+       select OF
+       select OF_FLATTREE
 
 config SWAP
        def_bool n
@@ -76,9 +78,6 @@ config LOCKDEP_SUPPORT
 config HAVE_LATENCYTOP_SUPPORT
        def_bool y
 
-config DTC
-       def_bool y
-
 source "init/Kconfig"
 
 source "kernel/Kconfig.freezer"
@@ -125,18 +124,6 @@ config CMDLINE_FORCE
          Set this to have arguments from the default kernel command string
          override those passed by the boot loader.
 
-config OF
-       def_bool y
-       select OF_FLATTREE
-
-config PROC_DEVICETREE
-       bool "Support for device tree in /proc"
-       depends on PROC_FS
-       help
-         This option adds a device-tree directory under /proc which contains
-         an image of the device tree that the kernel copies from Open
-         Firmware or other boot firmware. If unsure, say Y here.
-
 endmenu
 
 menu "Advanced setup"
index 31a35c33df6302c2be2509b777d262e24c02445d..ec5583d6111cc4a6f98d6c9c1e8e07d669db9aba 100644 (file)
@@ -27,17 +27,6 @@ extern unsigned int nr_irq;
 struct pt_regs;
 extern void do_IRQ(struct pt_regs *regs);
 
-/**
- * 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
- * @index: Index of the interrupt to map
- *
- * This function is a wrapper that chains of_irq_map_one() and
- * irq_create_of_mapping() to make things easier to callers
- */
-struct device_node;
-extern unsigned int irq_of_parse_and_map(struct device_node *dev, int index);
-
 /** FIXME - not implement
  * irq_dispose_mapping - Unmap an interrupt
  * @virq: linux virq number of the interrupt to unmap
@@ -62,17 +51,4 @@ struct irq_host;
 extern unsigned int irq_create_mapping(struct irq_host *host,
                                        irq_hw_number_t hwirq);
 
-/**
- * irq_create_of_mapping - Map a hardware interrupt into linux virq space
- * @controller: Device node of the interrupt controller
- * @inspec: Interrupt specifier from the device-tree
- * @intsize: Size of the interrupt specifier from the device-tree
- *
- * This function is identical to irq_create_mapping except that it takes
- * as input informations straight from the device-tree (typically the results
- * of the of_irq_map_*() functions.
- */
-extern unsigned int irq_create_of_mapping(struct device_node *controller,
-                                       u32 *intspec, unsigned int intsize);
-
 #endif /* _ASM_MICROBLAZE_IRQ_H */
diff --git a/arch/microblaze/include/asm/of_device.h b/arch/microblaze/include/asm/of_device.h
deleted file mode 100644 (file)
index 73cb980..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2007-2008 Michal Simek <monstr@monstr.eu>
- *
- * based on PowerPC of_device.h
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#ifndef _ASM_MICROBLAZE_OF_DEVICE_H
-#define _ASM_MICROBLAZE_OF_DEVICE_H
-#ifdef __KERNEL__
-
-#include <linux/device.h>
-#include <linux/of.h>
-
-/*
- * The of_device is a kind of "base class" that is a superset of
- * struct device for use by devices attached to an OF node and
- * probed using OF properties.
- */
-struct of_device {
-       struct device           dev; /* Generic device interface */
-       struct pdev_archdata    archdata;
-};
-
-extern ssize_t of_device_get_modalias(struct of_device *ofdev,
-                                       char *str, ssize_t len);
-
-extern struct of_device *of_device_alloc(struct device_node *np,
-                                        const char *bus_id,
-                                        struct device *parent);
-
-extern int of_device_uevent(struct device *dev,
-                           struct kobj_uevent_env *env);
-
-extern void of_device_make_bus_id(struct of_device *dev);
-
-/* This is just here during the transition */
-#include <linux/of_device.h>
-
-#endif /* __KERNEL__ */
-#endif /* _ASM_MICROBLAZE_OF_DEVICE_H */
diff --git a/arch/microblaze/include/asm/of_platform.h b/arch/microblaze/include/asm/of_platform.h
deleted file mode 100644 (file)
index 3749127..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corp.
- *                     <benh@kernel.crashing.org>
- *
- * 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 _ASM_MICROBLAZE_OF_PLATFORM_H
-#define _ASM_MICROBLAZE_OF_PLATFORM_H
-
-/* This is just here during the transition */
-#include <linux/of_platform.h>
-
-/*
- * The list of OF IDs below is used for matching bus types in the
- * system whose devices are to be exposed as of_platform_devices.
- *
- * This is the default list valid for most platforms. This file provides
- * functions who can take an explicit list if necessary though
- *
- * The search is always performed recursively looking for children of
- * the provided device_node and recursively if such a children matches
- * a bus type in the list
- */
-
-static const struct of_device_id of_default_bus_ids[] = {
-       { .type = "soc", },
-       { .compatible = "soc", },
-       { .type = "plb5", },
-       { .type = "plb4", },
-       { .type = "opb", },
-       { .type = "simple", },
-       {},
-};
-
-/* Platform devices and busses creation */
-extern struct of_device *of_platform_device_create(struct device_node *np,
-                                               const char *bus_id,
-                                               struct device *parent);
-/* pseudo "matches" value to not do deep probe */
-#define OF_NO_DEEP_PROBE ((struct of_device_id *)-1)
-
-extern int of_platform_bus_probe(struct device_node *root,
-                               const struct of_device_id *matches,
-                               struct device *parent);
-
-extern struct of_device *of_find_device_by_phandle(phandle ph);
-
-extern void of_instantiate_rtc(void);
-
-#endif /* _ASM_MICROBLAZE_OF_PLATFORM_H */
index c12c6dfafd9f9bc503b16be2fe7bd026539930db..4f268faa0126eea67f76ee4523d2ce8d2c666151 100644 (file)
 #define PAGE_UP(addr)  (((addr)+((PAGE_SIZE)-1))&(~((PAGE_SIZE)-1)))
 #define PAGE_DOWN(addr)        ((addr)&(~((PAGE_SIZE)-1)))
 
-/* align addr on a size boundary - adjust address up/down if needed */
-#define _ALIGN_UP(addr, size)  (((addr)+((size)-1))&(~((size)-1)))
-#define _ALIGN_DOWN(addr, size)        ((addr)&(~((size)-1)))
-
-/* align addr on a size boundary - adjust address up if needed */
-#define _ALIGN(addr, size)     _ALIGN_UP(addr, size)
-
 #ifndef CONFIG_MMU
 /*
  * PAGE_OFFSET -- the first address of the first page of memory. When not
index 0c77cda9f5d80eb6de7b003c09c05ce7a1fea97b..0c68764ab547ea938f2e5210d37f27fd597b4b23 100644 (file)
@@ -172,13 +172,8 @@ static inline int pci_has_flag(int flag)
 
 extern struct list_head hose_list;
 
-extern unsigned long pci_address_to_pio(phys_addr_t address);
 extern int pcibios_vaddr_is_ioport(void __iomem *address);
 #else
-static inline unsigned long pci_address_to_pio(phys_addr_t address)
-{
-       return (unsigned long)-1;
-}
 static inline int pcibios_vaddr_is_ioport(void __iomem *address)
 {
        return 0;
index e7d67a329bd7d9046004a204864e277bdee92053..101fa098f62af7576f05b694a346e80349ae2c2d 100644 (file)
@@ -20,9 +20,6 @@
 #ifndef __ASSEMBLY__
 
 #include <linux/types.h>
-#include <linux/of_fdt.h>
-#include <linux/proc_fs.h>
-#include <linux/platform_device.h>
 #include <asm/irq.h>
 #include <asm/atomic.h>
 
@@ -50,29 +47,10 @@ extern void pci_create_OF_bus_map(void);
  * OF address retreival & translation
  */
 
-/* Translate an OF address block into a CPU physical address
- */
-extern u64 of_translate_address(struct device_node *np, const u32 *addr);
-
-/* Extract an address from a device, returns the region size and
- * the address space flags too. The PCI version uses a BAR number
- * instead of an absolute index
- */
-extern const u32 *of_get_address(struct device_node *dev, int index,
-                       u64 *size, unsigned int *flags);
-extern const u32 *of_get_pci_address(struct device_node *dev, int bar_no,
-                       u64 *size, unsigned int *flags);
-
-/* Get an address as a resource. Note that if your address is
- * a PIO address, the conversion will fail if the physical address
- * can't be internally converted to an IO token with
- * pci_address_to_pio(), that is because it's either called to early
- * or it can't be matched to any host bridge IO space
- */
-extern int of_address_to_resource(struct device_node *dev, int index,
-                               struct resource *r);
-extern int of_pci_address_to_resource(struct device_node *dev, int bar,
-                               struct resource *r);
+#ifdef CONFIG_PCI
+extern unsigned long pci_address_to_pio(phys_addr_t address);
+#define pci_address_to_pio pci_address_to_pio
+#endif /* CONFIG_PCI */
 
 /* Parse the ibm,dma-window property of an OF node into the busno, phys and
  * size parameters.
@@ -88,69 +66,6 @@ struct device_node *of_get_cpu_node(int cpu, unsigned int *thread);
 /* Get the MAC address */
 extern const void *of_get_mac_address(struct device_node *np);
 
-/*
- * OF interrupt mapping
- */
-
-/* This structure is returned when an interrupt is mapped. The controller
- * field needs to be put() after use
- */
-
-#define OF_MAX_IRQ_SPEC                4 /* We handle specifiers of at most 4 cells */
-
-struct of_irq {
-       struct device_node *controller; /* Interrupt controller node */
-       u32 size; /* Specifier size */
-       u32 specifier[OF_MAX_IRQ_SPEC]; /* Specifier copy */
-};
-
-/**
- * of_irq_map_init - Initialize the irq remapper
- * @flags:     flags defining workarounds to enable
- *
- * Some machines have bugs in the device-tree which require certain workarounds
- * to be applied. Call this before any interrupt mapping attempts to enable
- * those workarounds.
- */
-#define OF_IMAP_OLDWORLD_MAC   0x00000001
-#define OF_IMAP_NO_PHANDLE     0x00000002
-
-extern void of_irq_map_init(unsigned int flags);
-
-/**
- * of_irq_map_raw - Low level interrupt tree parsing
- * @parent:    the device interrupt parent
- * @intspec:   interrupt specifier ("interrupts" property of the device)
- * @ointsize:  size of the passed in interrupt specifier
- * @addr:      address specifier (start of "reg" property of the device)
- * @out_irq:   structure of_irq filled by this function
- *
- * Returns 0 on success and a negative number on error
- *
- * This function is a low-level interrupt tree walking function. It
- * can be used to do a partial walk with synthetized reg and interrupts
- * properties, for example when resolving PCI interrupts when no device
- * node exist for the parent.
- *
- */
-
-extern int of_irq_map_raw(struct device_node *parent, const u32 *intspec,
-                       u32 ointsize, const u32 *addr,
-                       struct of_irq *out_irq);
-
-/**
- * of_irq_map_one - Resolve an interrupt for a device
- * @device:    the device whose interrupt is to be resolved
- * @index:     index of the interrupt to resolve
- * @out_irq:   structure of_irq filled by this function
- *
- * This function resolves an interrupt, walking the tree, for a given
- * device-tree node. It's the high level pendant to of_irq_map_raw().
- * It also implements the workarounds for OldWolrd Macs.
- */
-extern int of_irq_map_one(struct device_node *device, int index,
-                       struct of_irq *out_irq);
-
 /**
  * of_irq_map_pci - Resolve the interrupt for a PCI device
  * @pdev:      the device whose interrupt is to be resolved
@@ -163,20 +78,18 @@ extern int of_irq_map_one(struct device_node *device, int index,
  * resolving using the OF tree walking.
  */
 struct pci_dev;
+struct of_irq;
 extern int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq);
 
-extern int of_irq_to_resource(struct device_node *dev, int index,
-                       struct resource *r);
-
-/**
- * of_iomap - Maps the memory mapped IO for a given device_node
- * @device:    the device whose io range will be mapped
- * @index:     index of the io range
- *
- * Returns a pointer to the mapped memory
- */
-extern void __iomem *of_iomap(struct device_node *device, int index);
-
 #endif /* __ASSEMBLY__ */
 #endif /* __KERNEL__ */
+
+/* These includes are put at the bottom because they may contain things
+ * that are overridden by this file.  Ideally they shouldn't be included
+ * by this file, but there are a bunch of .c files that currently depend
+ * on it.  Eventually they will be cleaned up. */
+#include <linux/of_fdt.h>
+#include <linux/of_irq.h>
+#include <linux/platform_device.h>
+
 #endif /* _ASM_MICROBLAZE_PROM_H */
index 96bcea5a99202c184337c37aadeb2fd042cd5d71..5428f333a02c701e9faba668173dda95181544db 100644 (file)
@@ -1,11 +1 @@
 #include <asm-generic/topology.h>
-
-#ifndef _ASM_MICROBLAZE_TOPOLOGY_H
-#define _ASM_MICROBLAZE_TOPOLOGY_H
-
-struct device_node;
-static inline int of_node_to_nid(struct device_node *device)
-{
-       return 0;
-}
-#endif /* _ASM_MICROBLAZE_TOPOLOGY_H */
index 5eecc9f1fbd9944dd741f239a40be6a159a385b9..f0cb5c26c81c2567d10646d596a9e864ee88b632 100644 (file)
@@ -15,8 +15,8 @@ endif
 extra-y := head.o vmlinux.lds
 
 obj-y += dma.o exceptions.o \
-       hw_exception_handler.o init_task.o intc.o irq.o of_device.o \
-       of_platform.o process.o prom.o prom_parse.o ptrace.o \
+       hw_exception_handler.o init_task.o intc.o irq.o \
+       process.o prom.o prom_parse.o ptrace.o \
        reset.o setup.o signal.o sys_microblaze.o timer.o traps.o unwind.o
 
 obj-y += cpu/
index 598f1fd61c89036423b20ea1237826703255c150..a9345fb4906a8923afa8066a88c6837205b27f7b 100644 (file)
 #include <linux/seq_file.h>
 #include <linux/kernel_stat.h>
 #include <linux/irq.h>
+#include <linux/of_irq.h>
 
 #include <asm/prom.h>
 
-unsigned int irq_of_parse_and_map(struct device_node *dev, int index)
-{
-       struct of_irq oirq;
-
-       if (of_irq_map_one(dev, index, &oirq))
-               return NO_IRQ;
-
-       return oirq.specifier[0];
-}
-EXPORT_SYMBOL_GPL(irq_of_parse_and_map);
-
 static u32 concurrent_irq;
 
 void __irq_entry do_IRQ(struct pt_regs *regs)
@@ -106,7 +96,7 @@ unsigned int irq_create_mapping(struct irq_host *host, irq_hw_number_t hwirq)
 EXPORT_SYMBOL_GPL(irq_create_mapping);
 
 unsigned int irq_create_of_mapping(struct device_node *controller,
-                                       u32 *intspec, unsigned int intsize)
+                                  const u32 *intspec, unsigned int intsize)
 {
        return intspec[0];
 }
diff --git a/arch/microblaze/kernel/of_device.c b/arch/microblaze/kernel/of_device.c
deleted file mode 100644 (file)
index b372787..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-#include <linux/string.h>
-#include <linux/kernel.h>
-#include <linux/of.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/mod_devicetable.h>
-#include <linux/slab.h>
-#include <linux/of_device.h>
-
-#include <linux/errno.h>
-
-void of_device_make_bus_id(struct of_device *dev)
-{
-       static atomic_t bus_no_reg_magic;
-       struct device_node *node = dev->dev.of_node;
-       const u32 *reg;
-       u64 addr;
-       int magic;
-
-       /*
-        * For MMIO, get the physical address
-        */
-       reg = of_get_property(node, "reg", NULL);
-       if (reg) {
-               addr = of_translate_address(node, reg);
-               if (addr != OF_BAD_ADDR) {
-                       dev_set_name(&dev->dev, "%llx.%s",
-                                    (unsigned long long)addr, node->name);
-                       return;
-               }
-       }
-
-       /*
-        * No BusID, use the node name and add a globally incremented
-        * counter (and pray...)
-        */
-       magic = atomic_add_return(1, &bus_no_reg_magic);
-       dev_set_name(&dev->dev, "%s.%d", node->name, magic - 1);
-}
-EXPORT_SYMBOL(of_device_make_bus_id);
-
-struct of_device *of_device_alloc(struct device_node *np,
-                                 const char *bus_id,
-                                 struct device *parent)
-{
-       struct of_device *dev;
-
-       dev = kzalloc(sizeof(*dev), GFP_KERNEL);
-       if (!dev)
-               return NULL;
-
-       dev->dev.of_node = of_node_get(np);
-       dev->dev.dma_mask = &dev->archdata.dma_mask;
-       dev->dev.parent = parent;
-       dev->dev.release = of_release_dev;
-
-       if (bus_id)
-               dev_set_name(&dev->dev, bus_id);
-       else
-               of_device_make_bus_id(dev);
-
-       return dev;
-}
-EXPORT_SYMBOL(of_device_alloc);
-
-int of_device_uevent(struct device *dev, struct kobj_uevent_env *env)
-{
-       struct of_device *ofdev;
-       const char *compat;
-       int seen = 0, cplen, sl;
-
-       if (!dev)
-               return -ENODEV;
-
-       ofdev = to_of_device(dev);
-
-       if (add_uevent_var(env, "OF_NAME=%s", ofdev->dev.of_node->name))
-               return -ENOMEM;
-
-       if (add_uevent_var(env, "OF_TYPE=%s", ofdev->dev.of_node->type))
-               return -ENOMEM;
-
-       /* Since the compatible field can contain pretty much anything
-        * it's not really legal to split it out with commas. We split it
-        * up using a number of environment variables instead. */
-
-       compat = of_get_property(ofdev->dev.of_node, "compatible", &cplen);
-       while (compat && *compat && cplen > 0) {
-               if (add_uevent_var(env, "OF_COMPATIBLE_%d=%s", seen, compat))
-                       return -ENOMEM;
-
-               sl = strlen(compat) + 1;
-               compat += sl;
-               cplen -= sl;
-               seen++;
-       }
-
-       if (add_uevent_var(env, "OF_COMPATIBLE_N=%d", seen))
-               return -ENOMEM;
-
-       /* modalias is trickier, we add it in 2 steps */
-       if (add_uevent_var(env, "MODALIAS="))
-               return -ENOMEM;
-       sl = of_device_get_modalias(ofdev, &env->buf[env->buflen-1],
-                                   sizeof(env->buf) - env->buflen);
-       if (sl >= (sizeof(env->buf) - env->buflen))
-               return -ENOMEM;
-       env->buflen += sl;
-
-       return 0;
-}
-EXPORT_SYMBOL(of_device_uevent);
diff --git a/arch/microblaze/kernel/of_platform.c b/arch/microblaze/kernel/of_platform.c
deleted file mode 100644 (file)
index ccf6f42..0000000
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- *    Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corp.
- *                      <benh@kernel.crashing.org>
- *    and               Arnd Bergmann, IBM Corp.
- *
- *  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.
- *
- */
-
-#undef DEBUG
-
-#include <linux/string.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/mod_devicetable.h>
-#include <linux/pci.h>
-#include <linux/of.h>
-#include <linux/of_device.h>
-#include <linux/of_platform.h>
-
-#include <linux/errno.h>
-#include <linux/topology.h>
-#include <asm/atomic.h>
-
-struct bus_type of_platform_bus_type = {
-       .uevent = of_device_uevent,
-};
-EXPORT_SYMBOL(of_platform_bus_type);
-
-static int __init of_bus_driver_init(void)
-{
-       return of_bus_type_init(&of_platform_bus_type, "of_platform");
-}
-postcore_initcall(of_bus_driver_init);
-
-struct of_device *of_platform_device_create(struct device_node *np,
-                                           const char *bus_id,
-                                           struct device *parent)
-{
-       struct of_device *dev;
-
-       dev = of_device_alloc(np, bus_id, parent);
-       if (!dev)
-               return NULL;
-
-       dev->archdata.dma_mask = 0xffffffffUL;
-       dev->dev.bus = &of_platform_bus_type;
-
-       /* We do not fill the DMA ops for platform devices by default.
-        * This is currently the responsibility of the platform code
-        * to do such, possibly using a device notifier
-        */
-
-       if (of_device_register(dev) != 0) {
-               of_device_free(dev);
-               return NULL;
-       }
-
-       return dev;
-}
-EXPORT_SYMBOL(of_platform_device_create);
-
-/**
- * of_platform_bus_create - Create an OF device for a bus node and all its
- * children. Optionally recursively instanciate matching busses.
- * @bus: device node of the bus to instanciate
- * @matches: match table, NULL to use the default, OF_NO_DEEP_PROBE to
- * disallow recursive creation of child busses
- */
-static int of_platform_bus_create(const struct device_node *bus,
-                                 const struct of_device_id *matches,
-                                 struct device *parent)
-{
-       struct device_node *child;
-       struct of_device *dev;
-       int rc = 0;
-
-       for_each_child_of_node(bus, child) {
-               pr_debug("   create child: %s\n", child->full_name);
-               dev = of_platform_device_create(child, NULL, parent);
-               if (dev == NULL)
-                       rc = -ENOMEM;
-               else if (!of_match_node(matches, child))
-                       continue;
-               if (rc == 0) {
-                       pr_debug("   and sub busses\n");
-                       rc = of_platform_bus_create(child, matches, &dev->dev);
-               }
-               if (rc) {
-                       of_node_put(child);
-                       break;
-               }
-       }
-       return rc;
-}
-
-
-/**
- * of_platform_bus_probe - Probe the device-tree for platform busses
- * @root: parent of the first level to probe or NULL for the root of the tree
- * @matches: match table, NULL to use the default
- * @parent: parent to hook devices from, NULL for toplevel
- *
- * Note that children of the provided root are not instanciated as devices
- * unless the specified root itself matches the bus list and is not NULL.
- */
-
-int of_platform_bus_probe(struct device_node *root,
-                         const struct of_device_id *matches,
-                         struct device *parent)
-{
-       struct device_node *child;
-       struct of_device *dev;
-       int rc = 0;
-
-       if (matches == NULL)
-               matches = of_default_bus_ids;
-       if (matches == OF_NO_DEEP_PROBE)
-               return -EINVAL;
-       if (root == NULL)
-               root = of_find_node_by_path("/");
-       else
-               of_node_get(root);
-
-       pr_debug("of_platform_bus_probe()\n");
-       pr_debug(" starting at: %s\n", root->full_name);
-
-       /* Do a self check of bus type, if there's a match, create
-        * children
-        */
-       if (of_match_node(matches, root)) {
-               pr_debug(" root match, create all sub devices\n");
-               dev = of_platform_device_create(root, NULL, parent);
-               if (dev == NULL) {
-                       rc = -ENOMEM;
-                       goto bail;
-               }
-               pr_debug(" create all sub busses\n");
-               rc = of_platform_bus_create(root, matches, &dev->dev);
-               goto bail;
-       }
-       for_each_child_of_node(root, child) {
-               if (!of_match_node(matches, child))
-                       continue;
-
-               pr_debug("  match: %s\n", child->full_name);
-               dev = of_platform_device_create(child, NULL, parent);
-               if (dev == NULL)
-                       rc = -ENOMEM;
-               else
-                       rc = of_platform_bus_create(child, matches, &dev->dev);
-               if (rc) {
-                       of_node_put(child);
-                       break;
-               }
-       }
- bail:
-       of_node_put(root);
-       return rc;
-}
-EXPORT_SYMBOL(of_platform_bus_probe);
-
-static int of_dev_node_match(struct device *dev, void *data)
-{
-       return to_of_device(dev)->dev.of_node == data;
-}
-
-struct of_device *of_find_device_by_node(struct device_node *np)
-{
-       struct device *dev;
-
-       dev = bus_find_device(&of_platform_bus_type,
-                             NULL, np, of_dev_node_match);
-       if (dev)
-               return to_of_device(dev);
-       return NULL;
-}
-EXPORT_SYMBOL(of_find_device_by_node);
-
-static int of_dev_phandle_match(struct device *dev, void *data)
-{
-       phandle *ph = data;
-       return to_of_device(dev)->dev.of_node->phandle == *ph;
-}
-
-struct of_device *of_find_device_by_phandle(phandle ph)
-{
-       struct device *dev;
-
-       dev = bus_find_device(&of_platform_bus_type,
-                             NULL, &ph, of_dev_phandle_match);
-       if (dev)
-               return to_of_device(dev);
-       return NULL;
-}
-EXPORT_SYMBOL(of_find_device_by_phandle);
index bf7e6c27e318f88a0cf5a8a352d7126f460f0be5..d33ba17601fa20d61c86c3ea982aab72ca6508e1 100644 (file)
 #include <linux/module.h>
 #include <linux/ioport.h>
 #include <linux/etherdevice.h>
+#include <linux/of_address.h>
 #include <asm/prom.h>
 #include <asm/pci-bridge.h>
 
-#define PRu64  "%llx"
-
-/* Max address size we deal with */
-#define OF_MAX_ADDR_CELLS      4
-#define OF_CHECK_COUNTS(na, ns)        ((na) > 0 && (na) <= OF_MAX_ADDR_CELLS && \
-                       (ns) > 0)
-
-static struct of_bus *of_match_bus(struct device_node *np);
-static int __of_address_to_resource(struct device_node *dev,
-               const u32 *addrp, u64 size, unsigned int flags,
-               struct resource *r);
-
-/* Debug utility */
-#ifdef DEBUG
-static void of_dump_addr(const char *s, const u32 *addr, int na)
-{
-       printk(KERN_INFO "%s", s);
-       while (na--)
-               printk(KERN_INFO " %08x", *(addr++));
-       printk(KERN_INFO "\n");
-}
-#else
-static void of_dump_addr(const char *s, const u32 *addr, int na) { }
-#endif
-
-/* Callbacks for bus specific translators */
-struct of_bus {
-       const char      *name;
-       const char      *addresses;
-       int             (*match)(struct device_node *parent);
-       void            (*count_cells)(struct device_node *child,
-                                       int *addrc, int *sizec);
-       u64             (*map)(u32 *addr, const u32 *range,
-                               int na, int ns, int pna);
-       int             (*translate)(u32 *addr, u64 offset, int na);
-       unsigned int    (*get_flags)(const u32 *addr);
-};
-
-/*
- * Default translator (generic bus)
- */
-
-static void of_bus_default_count_cells(struct device_node *dev,
-                                       int *addrc, int *sizec)
-{
-       if (addrc)
-               *addrc = of_n_addr_cells(dev);
-       if (sizec)
-               *sizec = of_n_size_cells(dev);
-}
-
-static u64 of_bus_default_map(u32 *addr, const u32 *range,
-               int na, int ns, int pna)
-{
-       u64 cp, s, da;
-
-       cp = of_read_number(range, na);
-       s  = of_read_number(range + na + pna, ns);
-       da = of_read_number(addr, na);
-
-       pr_debug("OF: default map, cp="PRu64", s="PRu64", da="PRu64"\n",
-               cp, s, da);
-
-       if (da < cp || da >= (cp + s))
-               return OF_BAD_ADDR;
-       return da - cp;
-}
-
-static int of_bus_default_translate(u32 *addr, u64 offset, int na)
-{
-       u64 a = of_read_number(addr, na);
-       memset(addr, 0, na * 4);
-       a += offset;
-       if (na > 1)
-               addr[na - 2] = a >> 32;
-       addr[na - 1] = a & 0xffffffffu;
-
-       return 0;
-}
-
-static unsigned int of_bus_default_get_flags(const u32 *addr)
-{
-       return IORESOURCE_MEM;
-}
-
 #ifdef CONFIG_PCI
-/*
- * PCI bus specific translator
- */
-
-static int of_bus_pci_match(struct device_node *np)
-{
-       /* "vci" is for the /chaos bridge on 1st-gen PCI powermacs */
-       return !strcmp(np->type, "pci") || !strcmp(np->type, "vci");
-}
-
-static void of_bus_pci_count_cells(struct device_node *np,
-                               int *addrc, int *sizec)
-{
-       if (addrc)
-               *addrc = 3;
-       if (sizec)
-               *sizec = 2;
-}
-
-static u64 of_bus_pci_map(u32 *addr, const u32 *range, int na, int ns, int pna)
-{
-       u64 cp, s, da;
-
-       /* Check address type match */
-       if ((addr[0] ^ range[0]) & 0x03000000)
-               return OF_BAD_ADDR;
-
-       /* Read address values, skipping high cell */
-       cp = of_read_number(range + 1, na - 1);
-       s  = of_read_number(range + na + pna, ns);
-       da = of_read_number(addr + 1, na - 1);
-
-       pr_debug("OF: PCI map, cp="PRu64", s="PRu64", da="PRu64"\n", cp, s, da);
-
-       if (da < cp || da >= (cp + s))
-               return OF_BAD_ADDR;
-       return da - cp;
-}
-
-static int of_bus_pci_translate(u32 *addr, u64 offset, int na)
-{
-       return of_bus_default_translate(addr + 1, offset, na - 1);
-}
-
-static unsigned int of_bus_pci_get_flags(const u32 *addr)
-{
-       unsigned int flags = 0;
-       u32 w = addr[0];
-
-       switch ((w >> 24) & 0x03) {
-       case 0x01:
-               flags |= IORESOURCE_IO;
-               break;
-       case 0x02: /* 32 bits */
-       case 0x03: /* 64 bits */
-               flags |= IORESOURCE_MEM;
-               break;
-       }
-       if (w & 0x40000000)
-               flags |= IORESOURCE_PREFETCH;
-       return flags;
-}
-
-const u32 *of_get_pci_address(struct device_node *dev, int bar_no, u64 *size,
-                       unsigned int *flags)
-{
-       const u32 *prop;
-       unsigned int psize;
-       struct device_node *parent;
-       struct of_bus *bus;
-       int onesize, i, na, ns;
-
-       /* Get parent & match bus type */
-       parent = of_get_parent(dev);
-       if (parent == NULL)
-               return NULL;
-       bus = of_match_bus(parent);
-       if (strcmp(bus->name, "pci")) {
-               of_node_put(parent);
-               return NULL;
-       }
-       bus->count_cells(dev, &na, &ns);
-       of_node_put(parent);
-       if (!OF_CHECK_COUNTS(na, ns))
-               return NULL;
-
-       /* Get "reg" or "assigned-addresses" property */
-       prop = of_get_property(dev, bus->addresses, &psize);
-       if (prop == NULL)
-               return NULL;
-       psize /= 4;
-
-       onesize = na + ns;
-       for (i = 0; psize >= onesize; psize -= onesize, prop += onesize, i++)
-               if ((prop[0] & 0xff) == ((bar_no * 4) + PCI_BASE_ADDRESS_0)) {
-                       if (size)
-                               *size = of_read_number(prop + na, ns);
-                       if (flags)
-                               *flags = bus->get_flags(prop);
-                       return prop;
-               }
-       return NULL;
-}
-EXPORT_SYMBOL(of_get_pci_address);
-
-int of_pci_address_to_resource(struct device_node *dev, int bar,
-                               struct resource *r)
-{
-       const u32       *addrp;
-       u64             size;
-       unsigned int    flags;
-
-       addrp = of_get_pci_address(dev, bar, &size, &flags);
-       if (addrp == NULL)
-               return -EINVAL;
-       return __of_address_to_resource(dev, addrp, size, flags, r);
-}
-EXPORT_SYMBOL_GPL(of_pci_address_to_resource);
-
-static u8 of_irq_pci_swizzle(u8 slot, u8 pin)
-{
-       return (((pin - 1) + slot) % 4) + 1;
-}
-
 int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq)
 {
        struct device_node *dn, *ppnode;
@@ -293,331 +85,6 @@ int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq)
 EXPORT_SYMBOL_GPL(of_irq_map_pci);
 #endif /* CONFIG_PCI */
 
-/*
- * ISA bus specific translator
- */
-
-static int of_bus_isa_match(struct device_node *np)
-{
-       return !strcmp(np->name, "isa");
-}
-
-static void of_bus_isa_count_cells(struct device_node *child,
-                               int *addrc, int *sizec)
-{
-       if (addrc)
-               *addrc = 2;
-       if (sizec)
-               *sizec = 1;
-}
-
-static u64 of_bus_isa_map(u32 *addr, const u32 *range, int na, int ns, int pna)
-{
-       u64 cp, s, da;
-
-       /* Check address type match */
-       if ((addr[0] ^ range[0]) & 0x00000001)
-               return OF_BAD_ADDR;
-
-       /* Read address values, skipping high cell */
-       cp = of_read_number(range + 1, na - 1);
-       s  = of_read_number(range + na + pna, ns);
-       da = of_read_number(addr + 1, na - 1);
-
-       pr_debug("OF: ISA map, cp="PRu64", s="PRu64", da="PRu64"\n", cp, s, da);
-
-       if (da < cp || da >= (cp + s))
-               return OF_BAD_ADDR;
-       return da - cp;
-}
-
-static int of_bus_isa_translate(u32 *addr, u64 offset, int na)
-{
-       return of_bus_default_translate(addr + 1, offset, na - 1);
-}
-
-static unsigned int of_bus_isa_get_flags(const u32 *addr)
-{
-       unsigned int flags = 0;
-       u32 w = addr[0];
-
-       if (w & 1)
-               flags |= IORESOURCE_IO;
-       else
-               flags |= IORESOURCE_MEM;
-       return flags;
-}
-
-/*
- * Array of bus specific translators
- */
-
-static struct of_bus of_busses[] = {
-#ifdef CONFIG_PCI
-       /* PCI */
-       {
-               .name = "pci",
-               .addresses = "assigned-addresses",
-               .match = of_bus_pci_match,
-               .count_cells = of_bus_pci_count_cells,
-               .map = of_bus_pci_map,
-               .translate = of_bus_pci_translate,
-               .get_flags = of_bus_pci_get_flags,
-       },
-#endif /* CONFIG_PCI */
-       /* ISA */
-       {
-               .name = "isa",
-               .addresses = "reg",
-               .match = of_bus_isa_match,
-               .count_cells = of_bus_isa_count_cells,
-               .map = of_bus_isa_map,
-               .translate = of_bus_isa_translate,
-               .get_flags = of_bus_isa_get_flags,
-       },
-       /* Default */
-       {
-               .name = "default",
-               .addresses = "reg",
-               .match = NULL,
-               .count_cells = of_bus_default_count_cells,
-               .map = of_bus_default_map,
-               .translate = of_bus_default_translate,
-               .get_flags = of_bus_default_get_flags,
-       },
-};
-
-static struct of_bus *of_match_bus(struct device_node *np)
-{
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(of_busses); i++)
-               if (!of_busses[i].match || of_busses[i].match(np))
-                       return &of_busses[i];
-       BUG();
-       return NULL;
-}
-
-static int of_translate_one(struct device_node *parent, struct of_bus *bus,
-                       struct of_bus *pbus, u32 *addr,
-                       int na, int ns, int pna)
-{
-       const u32 *ranges;
-       unsigned int rlen;
-       int rone;
-       u64 offset = OF_BAD_ADDR;
-
-       /* Normally, an absence of a "ranges" property means we are
-        * crossing a non-translatable boundary, and thus the addresses
-        * below the current not cannot be converted to CPU physical ones.
-        * Unfortunately, while this is very clear in the spec, it's not
-        * what Apple understood, and they do have things like /uni-n or
-        * /ht nodes with no "ranges" property and a lot of perfectly
-        * useable mapped devices below them. Thus we treat the absence of
-        * "ranges" as equivalent to an empty "ranges" property which means
-        * a 1:1 translation at that level. It's up to the caller not to try
-        * to translate addresses that aren't supposed to be translated in
-        * the first place. --BenH.
-        */
-       ranges = of_get_property(parent, "ranges", (int *) &rlen);
-       if (ranges == NULL || rlen == 0) {
-               offset = of_read_number(addr, na);
-               memset(addr, 0, pna * 4);
-               pr_debug("OF: no ranges, 1:1 translation\n");
-               goto finish;
-       }
-
-       pr_debug("OF: walking ranges...\n");
-
-       /* Now walk through the ranges */
-       rlen /= 4;
-       rone = na + pna + ns;
-       for (; rlen >= rone; rlen -= rone, ranges += rone) {
-               offset = bus->map(addr, ranges, na, ns, pna);
-               if (offset != OF_BAD_ADDR)
-                       break;
-       }
-       if (offset == OF_BAD_ADDR) {
-               pr_debug("OF: not found !\n");
-               return 1;
-       }
-       memcpy(addr, ranges + na, 4 * pna);
-
- finish:
-       of_dump_addr("OF: parent translation for:", addr, pna);
-       pr_debug("OF: with offset: "PRu64"\n", offset);
-
-       /* Translate it into parent bus space */
-       return pbus->translate(addr, offset, pna);
-}
-
-/*
- * Translate an address from the device-tree into a CPU physical address,
- * this walks up the tree and applies the various bus mappings on the
- * way.
- *
- * Note: We consider that crossing any level with #size-cells == 0 to mean
- * that translation is impossible (that is we are not dealing with a value
- * that can be mapped to a cpu physical address). This is not really specified
- * that way, but this is traditionally the way IBM at least do things
- */
-u64 of_translate_address(struct device_node *dev, const u32 *in_addr)
-{
-       struct device_node *parent = NULL;
-       struct of_bus *bus, *pbus;
-       u32 addr[OF_MAX_ADDR_CELLS];
-       int na, ns, pna, pns;
-       u64 result = OF_BAD_ADDR;
-
-       pr_debug("OF: ** translation for device %s **\n", dev->full_name);
-
-       /* Increase refcount at current level */
-       of_node_get(dev);
-
-       /* Get parent & match bus type */
-       parent = of_get_parent(dev);
-       if (parent == NULL)
-               goto bail;
-       bus = of_match_bus(parent);
-
-       /* Cound address cells & copy address locally */
-       bus->count_cells(dev, &na, &ns);
-       if (!OF_CHECK_COUNTS(na, ns)) {
-               printk(KERN_ERR "prom_parse: Bad cell count for %s\n",
-                       dev->full_name);
-               goto bail;
-       }
-       memcpy(addr, in_addr, na * 4);
-
-       pr_debug("OF: bus is %s (na=%d, ns=%d) on %s\n",
-               bus->name, na, ns, parent->full_name);
-       of_dump_addr("OF: translating address:", addr, na);
-
-       /* Translate */
-       for (;;) {
-               /* Switch to parent bus */
-               of_node_put(dev);
-               dev = parent;
-               parent = of_get_parent(dev);
-
-               /* If root, we have finished */
-               if (parent == NULL) {
-                       pr_debug("OF: reached root node\n");
-                       result = of_read_number(addr, na);
-                       break;
-               }
-
-               /* Get new parent bus and counts */
-               pbus = of_match_bus(parent);
-               pbus->count_cells(dev, &pna, &pns);
-               if (!OF_CHECK_COUNTS(pna, pns)) {
-                       printk(KERN_ERR "prom_parse: Bad cell count for %s\n",
-                               dev->full_name);
-                       break;
-               }
-
-               pr_debug("OF: parent bus is %s (na=%d, ns=%d) on %s\n",
-                       pbus->name, pna, pns, parent->full_name);
-
-               /* Apply bus translation */
-               if (of_translate_one(dev, bus, pbus, addr, na, ns, pna))
-                       break;
-
-               /* Complete the move up one level */
-               na = pna;
-               ns = pns;
-               bus = pbus;
-
-               of_dump_addr("OF: one level translation:", addr, na);
-       }
- bail:
-       of_node_put(parent);
-       of_node_put(dev);
-
-       return result;
-}
-EXPORT_SYMBOL(of_translate_address);
-
-const u32 *of_get_address(struct device_node *dev, int index, u64 *size,
-                       unsigned int *flags)
-{
-       const u32 *prop;
-       unsigned int psize;
-       struct device_node *parent;
-       struct of_bus *bus;
-       int onesize, i, na, ns;
-
-       /* Get parent & match bus type */
-       parent = of_get_parent(dev);
-       if (parent == NULL)
-               return NULL;
-       bus = of_match_bus(parent);
-       bus->count_cells(dev, &na, &ns);
-       of_node_put(parent);
-       if (!OF_CHECK_COUNTS(na, ns))
-               return NULL;
-
-       /* Get "reg" or "assigned-addresses" property */
-       prop = of_get_property(dev, bus->addresses, (int *) &psize);
-       if (prop == NULL)
-               return NULL;
-       psize /= 4;
-
-       onesize = na + ns;
-       for (i = 0; psize >= onesize; psize -= onesize, prop += onesize, i++)
-               if (i == index) {
-                       if (size)
-                               *size = of_read_number(prop + na, ns);
-                       if (flags)
-                               *flags = bus->get_flags(prop);
-                       return prop;
-               }
-       return NULL;
-}
-EXPORT_SYMBOL(of_get_address);
-
-static int __of_address_to_resource(struct device_node *dev, const u32 *addrp,
-                               u64 size, unsigned int flags,
-                               struct resource *r)
-{
-       u64 taddr;
-
-       if ((flags & (IORESOURCE_IO | IORESOURCE_MEM)) == 0)
-               return -EINVAL;
-       taddr = of_translate_address(dev, addrp);
-       if (taddr == OF_BAD_ADDR)
-               return -EINVAL;
-       memset(r, 0, sizeof(struct resource));
-       if (flags & IORESOURCE_IO) {
-               unsigned long port;
-               port = -1; /* pci_address_to_pio(taddr); */
-               if (port == (unsigned long)-1)
-                       return -EINVAL;
-               r->start = port;
-               r->end = port + size - 1;
-       } else {
-               r->start = taddr;
-               r->end = taddr + size - 1;
-       }
-       r->flags = flags;
-       r->name = dev->name;
-       return 0;
-}
-
-int of_address_to_resource(struct device_node *dev, int index,
-                       struct resource *r)
-{
-       const u32       *addrp;
-       u64             size;
-       unsigned int    flags;
-
-       addrp = of_get_address(dev, index, &size, &flags);
-       if (addrp == NULL)
-               return -EINVAL;
-       return __of_address_to_resource(dev, addrp, size, flags, r);
-}
-EXPORT_SYMBOL_GPL(of_address_to_resource);
-
 void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop,
                unsigned long *busno, unsigned long *phys, unsigned long *size)
 {
@@ -644,308 +111,6 @@ void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop,
        *size = of_read_number(dma_window, cells);
 }
 
-/*
- * Interrupt remapper
- */
-
-static unsigned int of_irq_workarounds;
-static struct device_node *of_irq_dflt_pic;
-
-static struct device_node *of_irq_find_parent(struct device_node *child)
-{
-       struct device_node *p;
-       const phandle *parp;
-
-       if (!of_node_get(child))
-               return NULL;
-
-       do {
-               parp = of_get_property(child, "interrupt-parent", NULL);
-               if (parp == NULL)
-                       p = of_get_parent(child);
-               else {
-                       if (of_irq_workarounds & OF_IMAP_NO_PHANDLE)
-                               p = of_node_get(of_irq_dflt_pic);
-                       else
-                               p = of_find_node_by_phandle(*parp);
-               }
-               of_node_put(child);
-               child = p;
-       } while (p && of_get_property(p, "#interrupt-cells", NULL) == NULL);
-
-       return p;
-}
-
-/* This doesn't need to be called if you don't have any special workaround
- * flags to pass
- */
-void of_irq_map_init(unsigned int flags)
-{
-       of_irq_workarounds = flags;
-
-       /* OldWorld, don't bother looking at other things */
-       if (flags & OF_IMAP_OLDWORLD_MAC)
-               return;
-
-       /* If we don't have phandles, let's try to locate a default interrupt
-        * controller (happens when booting with BootX). We do a first match
-        * here, hopefully, that only ever happens on machines with one
-        * controller.
-        */
-       if (flags & OF_IMAP_NO_PHANDLE) {
-               struct device_node *np;
-
-               for (np = NULL; (np = of_find_all_nodes(np)) != NULL;) {
-                       if (of_get_property(np, "interrupt-controller", NULL)
-                               == NULL)
-                               continue;
-                       /* Skip /chosen/interrupt-controller */
-                       if (strcmp(np->name, "chosen") == 0)
-                               continue;
-                       /* It seems like at least one person on this planet
-                        * wants to use BootX on a machine with an AppleKiwi
-                        * controller which happens to pretend to be an
-                        * interrupt controller too.
-                        */
-                       if (strcmp(np->name, "AppleKiwi") == 0)
-                               continue;
-                       /* I think we found one ! */
-                       of_irq_dflt_pic = np;
-                       break;
-               }
-       }
-
-}
-
-int of_irq_map_raw(struct device_node *parent, const u32 *intspec, u32 ointsize,
-               const u32 *addr, struct of_irq *out_irq)
-{
-       struct device_node *ipar, *tnode, *old = NULL, *newpar = NULL;
-       const u32 *tmp, *imap, *imask;
-       u32 intsize = 1, addrsize, newintsize = 0, newaddrsize = 0;
-       int imaplen, match, i;
-
-       pr_debug("of_irq_map_raw: par=%s,intspec=[0x%08x 0x%08x...],"
-               "ointsize=%d\n",
-               parent->full_name, intspec[0], intspec[1], ointsize);
-
-       ipar = of_node_get(parent);
-
-       /* First get the #interrupt-cells property of the current cursor
-        * that tells us how to interpret the passed-in intspec. If there
-        * is none, we are nice and just walk up the tree
-        */
-       do {
-               tmp = of_get_property(ipar, "#interrupt-cells", NULL);
-               if (tmp != NULL) {
-                       intsize = *tmp;
-                       break;
-               }
-               tnode = ipar;
-               ipar = of_irq_find_parent(ipar);
-               of_node_put(tnode);
-       } while (ipar);
-       if (ipar == NULL) {
-               pr_debug(" -> no parent found !\n");
-               goto fail;
-       }
-
-       pr_debug("of_irq_map_raw: ipar=%s, size=%d\n",
-                       ipar->full_name, intsize);
-
-       if (ointsize != intsize)
-               return -EINVAL;
-
-       /* Look for this #address-cells. We have to implement the old linux
-        * trick of looking for the parent here as some device-trees rely on it
-        */
-       old = of_node_get(ipar);
-       do {
-               tmp = of_get_property(old, "#address-cells", NULL);
-               tnode = of_get_parent(old);
-               of_node_put(old);
-               old = tnode;
-       } while (old && tmp == NULL);
-       of_node_put(old);
-       old = NULL;
-       addrsize = (tmp == NULL) ? 2 : *tmp;
-
-       pr_debug(" -> addrsize=%d\n", addrsize);
-
-       /* Now start the actual "proper" walk of the interrupt tree */
-       while (ipar != NULL) {
-               /* Now check if cursor is an interrupt-controller and if it is
-                * then we are done
-                */
-               if (of_get_property(ipar, "interrupt-controller", NULL) !=
-                               NULL) {
-                       pr_debug(" -> got it !\n");
-                       memcpy(out_irq->specifier, intspec,
-                               intsize * sizeof(u32));
-                       out_irq->size = intsize;
-                       out_irq->controller = ipar;
-                       of_node_put(old);
-                       return 0;
-               }
-
-               /* Now look for an interrupt-map */
-               imap = of_get_property(ipar, "interrupt-map", &imaplen);
-               /* No interrupt map, check for an interrupt parent */
-               if (imap == NULL) {
-                       pr_debug(" -> no map, getting parent\n");
-                       newpar = of_irq_find_parent(ipar);
-                       goto skiplevel;
-               }
-               imaplen /= sizeof(u32);
-
-               /* Look for a mask */
-               imask = of_get_property(ipar, "interrupt-map-mask", NULL);
-
-               /* If we were passed no "reg" property and we attempt to parse
-                * an interrupt-map, then #address-cells must be 0.
-                * Fail if it's not.
-                */
-               if (addr == NULL && addrsize != 0) {
-                       pr_debug(" -> no reg passed in when needed !\n");
-                       goto fail;
-               }
-
-               /* Parse interrupt-map */
-               match = 0;
-               while (imaplen > (addrsize + intsize + 1) && !match) {
-                       /* Compare specifiers */
-                       match = 1;
-                       for (i = 0; i < addrsize && match; ++i) {
-                               u32 mask = imask ? imask[i] : 0xffffffffu;
-                               match = ((addr[i] ^ imap[i]) & mask) == 0;
-                       }
-                       for (; i < (addrsize + intsize) && match; ++i) {
-                               u32 mask = imask ? imask[i] : 0xffffffffu;
-                               match =
-                                       ((intspec[i-addrsize] ^ imap[i])
-                                               & mask) == 0;
-                       }
-                       imap += addrsize + intsize;
-                       imaplen -= addrsize + intsize;
-
-                       pr_debug(" -> match=%d (imaplen=%d)\n", match, imaplen);
-
-                       /* Get the interrupt parent */
-                       if (of_irq_workarounds & OF_IMAP_NO_PHANDLE)
-                               newpar = of_node_get(of_irq_dflt_pic);
-                       else
-                               newpar =
-                                       of_find_node_by_phandle((phandle)*imap);
-                       imap++;
-                       --imaplen;
-
-                       /* Check if not found */
-                       if (newpar == NULL) {
-                               pr_debug(" -> imap parent not found !\n");
-                               goto fail;
-                       }
-
-                       /* Get #interrupt-cells and #address-cells of new
-                        * parent
-                        */
-                       tmp = of_get_property(newpar, "#interrupt-cells", NULL);
-                       if (tmp == NULL) {
-                               pr_debug(" -> parent lacks "
-                                               "#interrupt-cells!\n");
-                               goto fail;
-                       }
-                       newintsize = *tmp;
-                       tmp = of_get_property(newpar, "#address-cells", NULL);
-                       newaddrsize = (tmp == NULL) ? 0 : *tmp;
-
-                       pr_debug(" -> newintsize=%d, newaddrsize=%d\n",
-                               newintsize, newaddrsize);
-
-                       /* Check for malformed properties */
-                       if (imaplen < (newaddrsize + newintsize))
-                               goto fail;
-
-                       imap += newaddrsize + newintsize;
-                       imaplen -= newaddrsize + newintsize;
-
-                       pr_debug(" -> imaplen=%d\n", imaplen);
-               }
-               if (!match)
-                       goto fail;
-
-               of_node_put(old);
-               old = of_node_get(newpar);
-               addrsize = newaddrsize;
-               intsize = newintsize;
-               intspec = imap - intsize;
-               addr = intspec - addrsize;
-
-skiplevel:
-               /* Iterate again with new parent */
-               pr_debug(" -> new parent: %s\n",
-                               newpar ? newpar->full_name : "<>");
-               of_node_put(ipar);
-               ipar = newpar;
-               newpar = NULL;
-       }
-fail:
-       of_node_put(ipar);
-       of_node_put(old);
-       of_node_put(newpar);
-
-       return -EINVAL;
-}
-EXPORT_SYMBOL_GPL(of_irq_map_raw);
-
-int of_irq_map_one(struct device_node *device,
-                       int index, struct of_irq *out_irq)
-{
-       struct device_node *p;
-       const u32 *intspec, *tmp, *addr;
-       u32 intsize, intlen;
-       int res;
-
-       pr_debug("of_irq_map_one: dev=%s, index=%d\n",
-                       device->full_name, index);
-
-       /* Get the interrupts property */
-       intspec = of_get_property(device, "interrupts", (int *) &intlen);
-       if (intspec == NULL)
-               return -EINVAL;
-       intlen /= sizeof(u32);
-
-       pr_debug(" intspec=%d intlen=%d\n", *intspec, intlen);
-
-       /* Get the reg property (if any) */
-       addr = of_get_property(device, "reg", NULL);
-
-       /* Look for the interrupt parent. */
-       p = of_irq_find_parent(device);
-       if (p == NULL)
-               return -EINVAL;
-
-       /* Get size of interrupt specifier */
-       tmp = of_get_property(p, "#interrupt-cells", NULL);
-       if (tmp == NULL) {
-               of_node_put(p);
-               return -EINVAL;
-       }
-       intsize = *tmp;
-
-       pr_debug(" intsize=%d intlen=%d\n", intsize, intlen);
-
-       /* Check index */
-       if ((index + 1) * intsize > intlen)
-               return -EINVAL;
-
-       /* Get new specifier and map it */
-       res = of_irq_map_raw(p, intspec + index * intsize, intsize,
-                               addr, out_irq);
-       of_node_put(p);
-       return res;
-}
-EXPORT_SYMBOL_GPL(of_irq_map_one);
-
 /**
  * Search the device tree for the best MAC address to use.  'mac-address' is
  * checked first, because that is supposed to contain to "most recent" MAC
@@ -983,43 +148,3 @@ const void *of_get_mac_address(struct device_node *np)
        return NULL;
 }
 EXPORT_SYMBOL(of_get_mac_address);
-
-int of_irq_to_resource(struct device_node *dev, int index, struct resource *r)
-{
-       struct of_irq out_irq;
-       int irq;
-       int res;
-
-       res = of_irq_map_one(dev, index, &out_irq);
-
-       /* Get irq for the device */
-       if (res) {
-               pr_debug("IRQ not found... code = %d", res);
-               return NO_IRQ;
-       }
-       /* Assuming single interrupt controller... */
-       irq = out_irq.specifier[0];
-
-       pr_debug("IRQ found = %d", irq);
-
-       /* Only dereference the resource if both the
-        * resource and the irq are valid. */
-       if (r && irq != NO_IRQ) {
-               r->start = r->end = irq;
-               r->flags = IORESOURCE_IRQ;
-       }
-
-       return irq;
-}
-EXPORT_SYMBOL_GPL(of_irq_to_resource);
-
-void __iomem *of_iomap(struct device_node *np, int index)
-{
-       struct resource res;
-
-       if (of_address_to_resource(np, index, &res))
-               return NULL;
-
-       return ioremap(res.start, 1 + res.end - res.start);
-}
-EXPORT_SYMBOL(of_iomap);
index a1721a33042e3d17c25dbc3ec1fddd8d05402a18..bd8ccab5ceff407287d3114d444ac467812a225f 100644 (file)
@@ -24,8 +24,8 @@ static int of_reset_gpio_handle(void)
        int ret; /* variable which stored handle reset gpio pin */
        struct device_node *root; /* root node */
        struct device_node *gpio; /* gpio node */
-       struct of_gpio_chip *of_gc = NULL;
-       enum of_gpio_flags flags ;
+       struct gpio_chip *gc;
+       u32 flags;
        const void *gpio_spec;
 
        /* find out root node */
@@ -39,19 +39,19 @@ static int of_reset_gpio_handle(void)
                goto err0;
        }
 
-       of_gc = gpio->data;
-       if (!of_gc) {
+       gc = of_node_to_gpiochip(gpio);
+       if (!gc) {
                pr_debug("%s: gpio controller %s isn't registered\n",
                         root->full_name, gpio->full_name);
                ret = -ENODEV;
                goto err1;
        }
 
-       ret = of_gc->xlate(of_gc, root, gpio_spec, &flags);
+       ret = gc->of_xlate(gc, root, gpio_spec, &flags);
        if (ret < 0)
                goto err1;
 
-       ret += of_gc->gc.base;
+       ret += gc->base;
 err1:
        of_node_put(gpio);
 err0:
index 17c98dbcec888f698e2c038eee317ddef7e1f7da..f5f768842354201266bf0dce0e7209484f49a4fa 100644 (file)
@@ -213,15 +213,9 @@ static struct notifier_block dflt_plat_bus_notifier = {
        .priority = INT_MAX,
 };
 
-static struct notifier_block dflt_of_bus_notifier = {
-       .notifier_call = dflt_bus_notify,
-       .priority = INT_MAX,
-};
-
 static int __init setup_bus_notifier(void)
 {
        bus_register_notifier(&platform_bus_type, &dflt_plat_bus_notifier);
-       bus_register_notifier(&of_platform_bus_type, &dflt_of_bus_notifier);
 
        return 0;
 }
index e4545f85ee9fa5ef3dfb38985b428dc706f25158..e2bf40a2ce5ac6d44be54bb3cc0e7b9b4d44e289 100644 (file)
@@ -120,6 +120,8 @@ config ARCH_NO_VIRT_TO_BUS
 config PPC
        bool
        default y
+       select OF
+       select OF_FLATTREE
        select HAVE_FTRACE_MCOUNT_RECORD
        select HAVE_DYNAMIC_FTRACE
        select HAVE_FUNCTION_TRACER
@@ -173,10 +175,6 @@ config ARCH_MAY_HAVE_PC_FDC
 config PPC_OF
        def_bool y
 
-config OF
-       def_bool y
-       select OF_FLATTREE
-
 config PPC_UDBG_16550
        bool
        default n
@@ -199,10 +197,6 @@ config SYS_SUPPORTS_APM_EMULATION
        default y if PMAC_APM_EMU
        bool
 
-config DTC
-       bool
-       default y
-
 config DEFAULT_UIMAGE
        bool
        help
@@ -579,14 +573,6 @@ config SCHED_SMT
          when dealing with POWER5 cpus at a cost of slightly increased
          overhead in some places. If unsure say N here.
 
-config PROC_DEVICETREE
-       bool "Support for device tree in /proc"
-       depends on PROC_FS
-       help
-         This option adds a device-tree directory under /proc which contains
-         an image of the device tree that the kernel copies from Open
-         Firmware or other boot firmware. If unsure, say Y here.
-
 config CMDLINE_BOOL
        bool "Default bootloader kernel arguments"
 
index ecba37a91749a1e869ed26afff90563b85813cb6..67ab5fb7d153690fd4af621c493f2c294895077c 100644 (file)
@@ -300,34 +300,6 @@ extern unsigned int irq_alloc_virt(struct irq_host *host,
  */
 extern void irq_free_virt(unsigned int virq, unsigned int count);
 
-
-/* -- OF helpers -- */
-
-/**
- * irq_create_of_mapping - Map a hardware interrupt into linux virq space
- * @controller: Device node of the interrupt controller
- * @inspec: Interrupt specifier from the device-tree
- * @intsize: Size of the interrupt specifier from the device-tree
- *
- * This function is identical to irq_create_mapping except that it takes
- * as input informations straight from the device-tree (typically the results
- * of the of_irq_map_*() functions.
- */
-extern unsigned int irq_create_of_mapping(struct device_node *controller,
-                                         const u32 *intspec, unsigned int intsize);
-
-/**
- * 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
- * @index: Index of the interrupt to map
- *
- * This function is a wrapper that chains of_irq_map_one() and
- * irq_create_of_mapping() to make things easier to callers
- */
-extern unsigned int irq_of_parse_and_map(struct device_node *dev, int index);
-
-/* -- End OF helpers -- */
-
 /**
  * irq_early_init - Init irq remapping subsystem
  */
index 675e159b5ef42decbf2617870963547f07016870..7ab82c825a034f7af25c19f5d78a88880022e2a2 100644 (file)
@@ -38,7 +38,7 @@ struct macio_dev
 {
        struct macio_bus        *bus;           /* macio bus this device is on */
        struct macio_dev        *media_bay;     /* Device is part of a media bay */
-       struct of_device        ofdev;
+       struct platform_device  ofdev;
        struct device_dma_parameters dma_parms; /* ide needs that */
        int                     n_resources;
        struct resource         resource[MACIO_DEV_COUNT_RESOURCES];
diff --git a/arch/powerpc/include/asm/of_device.h b/arch/powerpc/include/asm/of_device.h
deleted file mode 100644 (file)
index 444e97e..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef _ASM_POWERPC_OF_DEVICE_H
-#define _ASM_POWERPC_OF_DEVICE_H
-#ifdef __KERNEL__
-
-#include <linux/device.h>
-#include <linux/of.h>
-
-/*
- * The of_device is a kind of "base class" that is a superset of
- * struct device for use by devices attached to an OF node and
- * probed using OF properties.
- */
-struct of_device
-{
-       struct device           dev;            /* Generic device interface */
-       struct pdev_archdata    archdata;
-};
-
-extern struct of_device *of_device_alloc(struct device_node *np,
-                                        const char *bus_id,
-                                        struct device *parent);
-
-extern int of_device_uevent(struct device *dev,
-                           struct kobj_uevent_env *env);
-
-#endif /* __KERNEL__ */
-#endif /* _ASM_POWERPC_OF_DEVICE_H */
diff --git a/arch/powerpc/include/asm/of_platform.h b/arch/powerpc/include/asm/of_platform.h
deleted file mode 100644 (file)
index d4aaa34..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef _ASM_POWERPC_OF_PLATFORM_H
-#define _ASM_POWERPC_OF_PLATFORM_H
-/*
- *    Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corp.
- *                      <benh@kernel.crashing.org>
- *
- *  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.
- *
- */
-
-/* Platform devices and busses creation */
-extern struct of_device *of_platform_device_create(struct device_node *np,
-                                                  const char *bus_id,
-                                                  struct device *parent);
-/* pseudo "matches" value to not do deep probe */
-#define OF_NO_DEEP_PROBE ((struct of_device_id *)-1)
-
-extern int of_platform_bus_probe(struct device_node *root,
-                                const struct of_device_id *matches,
-                                struct device *parent);
-
-extern struct of_device *of_find_device_by_phandle(phandle ph);
-
-extern void of_instantiate_rtc(void);
-
-#endif /* _ASM_POWERPC_OF_PLATFORM_H */
index 76e1f313a58e2306451f6f933915690db1b4ddd9..51e9e6f90d12110aa70ae04cb8c922164947c121 100644 (file)
@@ -303,13 +303,8 @@ extern void pcibios_free_controller(struct pci_controller *phb);
 extern void pcibios_setup_phb_resources(struct pci_controller *hose);
 
 #ifdef CONFIG_PCI
-extern unsigned long pci_address_to_pio(phys_addr_t address);
 extern int pcibios_vaddr_is_ioport(void __iomem *address);
 #else
-static inline unsigned long pci_address_to_pio(phys_addr_t address)
-{
-       return (unsigned long)-1;
-}
 static inline int pcibios_vaddr_is_ioport(void __iomem *address)
 {
        return 0;
index ddd408a93b5a526c1c30d24c7c4d1a119365e338..ae26f2efd089c80d92f0c9b50ea434dd43464f91 100644 (file)
@@ -17,9 +17,6 @@
  * 2 of the License, or (at your option) any later version.
  */
 #include <linux/types.h>
-#include <linux/of_fdt.h>
-#include <linux/proc_fs.h>
-#include <linux/platform_device.h>
 #include <asm/irq.h>
 #include <asm/atomic.h>
 
@@ -43,49 +40,14 @@ extern void pci_create_OF_bus_map(void);
  * OF address retreival & translation
  */
 
-/* Translate an OF address block into a CPU physical address
- */
-extern u64 of_translate_address(struct device_node *np, const u32 *addr);
-
 /* Translate a DMA address from device space to CPU space */
 extern u64 of_translate_dma_address(struct device_node *dev,
                                    const u32 *in_addr);
 
-/* Extract an address from a device, returns the region size and
- * the address space flags too. The PCI version uses a BAR number
- * instead of an absolute index
- */
-extern const u32 *of_get_address(struct device_node *dev, int index,
-                          u64 *size, unsigned int *flags);
 #ifdef CONFIG_PCI
-extern const u32 *of_get_pci_address(struct device_node *dev, int bar_no,
-                              u64 *size, unsigned int *flags);
-#else
-static inline const u32 *of_get_pci_address(struct device_node *dev,
-               int bar_no, u64 *size, unsigned int *flags)
-{
-       return NULL;
-}
-#endif /* CONFIG_PCI */
-
-/* Get an address as a resource. Note that if your address is
- * a PIO address, the conversion will fail if the physical address
- * can't be internally converted to an IO token with
- * pci_address_to_pio(), that is because it's either called to early
- * or it can't be matched to any host bridge IO space
- */
-extern int of_address_to_resource(struct device_node *dev, int index,
-                                 struct resource *r);
-#ifdef CONFIG_PCI
-extern int of_pci_address_to_resource(struct device_node *dev, int bar,
-                                     struct resource *r);
-#else
-static inline int of_pci_address_to_resource(struct device_node *dev, int bar,
-               struct resource *r)
-{
-       return -ENOSYS;
-}
-#endif /* CONFIG_PCI */
+extern unsigned long pci_address_to_pio(phys_addr_t address);
+#define pci_address_to_pio pci_address_to_pio
+#endif /* CONFIG_PCI */
 
 /* Parse the ibm,dma-window property of an OF node into the busno, phys and
  * size parameters.
@@ -104,69 +66,12 @@ struct device_node *of_find_next_cache_node(struct device_node *np);
 /* Get the MAC address */
 extern const void *of_get_mac_address(struct device_node *np);
 
-/*
- * OF interrupt mapping
- */
-
-/* This structure is returned when an interrupt is mapped. The controller
- * field needs to be put() after use
- */
-
-#define OF_MAX_IRQ_SPEC                 4 /* We handle specifiers of at most 4 cells */
-
-struct of_irq {
-       struct device_node *controller; /* Interrupt controller node */
-       u32 size;                       /* Specifier size */
-       u32 specifier[OF_MAX_IRQ_SPEC]; /* Specifier copy */
-};
-
-/**
- * of_irq_map_init - Initialize the irq remapper
- * @flags:     flags defining workarounds to enable
- *
- * Some machines have bugs in the device-tree which require certain workarounds
- * to be applied. Call this before any interrupt mapping attempts to enable
- * those workarounds.
- */
-#define OF_IMAP_OLDWORLD_MAC   0x00000001
-#define OF_IMAP_NO_PHANDLE     0x00000002
-
-extern void of_irq_map_init(unsigned int flags);
-
-/**
- * of_irq_map_raw - Low level interrupt tree parsing
- * @parent:    the device interrupt parent
- * @intspec:   interrupt specifier ("interrupts" property of the device)
- * @ointsize:   size of the passed in interrupt specifier
- * @addr:      address specifier (start of "reg" property of the device)
- * @out_irq:   structure of_irq filled by this function
- *
- * Returns 0 on success and a negative number on error
- *
- * This function is a low-level interrupt tree walking function. It
- * can be used to do a partial walk with synthetized reg and interrupts
- * properties, for example when resolving PCI interrupts when no device
- * node exist for the parent.
- *
- */
-
-extern int of_irq_map_raw(struct device_node *parent, const u32 *intspec,
-                         u32 ointsize, const u32 *addr,
-                         struct of_irq *out_irq);
-
-
-/**
- * of_irq_map_one - Resolve an interrupt for a device
- * @device:    the device whose interrupt is to be resolved
- * @index:             index of the interrupt to resolve
- * @out_irq:   structure of_irq filled by this function
- *
- * This function resolves an interrupt, walking the tree, for a given
- * device-tree node. It's the high level pendant to of_irq_map_raw().
- * It also implements the workarounds for OldWolrd Macs.
- */
-extern int of_irq_map_one(struct device_node *device, int index,
-                         struct of_irq *out_irq);
+#ifdef CONFIG_NUMA
+extern int of_node_to_nid(struct device_node *device);
+#else
+static inline int of_node_to_nid(struct device_node *device) { return 0; }
+#endif
+#define of_node_to_nid of_node_to_nid
 
 /**
  * of_irq_map_pci - Resolve the interrupt for a PCI device
@@ -180,19 +85,19 @@ extern int of_irq_map_one(struct device_node *device, int index,
  * resolving using the OF tree walking.
  */
 struct pci_dev;
+struct of_irq;
 extern int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq);
 
-extern int of_irq_to_resource(struct device_node *dev, int index,
-                       struct resource *r);
+extern void of_instantiate_rtc(void);
 
-/**
- * of_iomap - Maps the memory mapped IO for a given device_node
- * @device:    the device whose io range will be mapped
- * @index:     index of the io range
- *
- * Returns a pointer to the mapped memory
- */
-extern void __iomem *of_iomap(struct device_node *device, int index);
+/* These includes are put at the bottom because they may contain things
+ * that are overridden by this file.  Ideally they shouldn't be included
+ * by this file, but there are a bunch of .c files that currently depend
+ * on it.  Eventually they will be cleaned up. */
+#include <linux/of_fdt.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/platform_device.h>
 
 #endif /* __KERNEL__ */
 #endif /* _POWERPC_PROM_H */
index 7ae2753da565d6435c05b8d0e9ff505ae94fa928..e3bdada8c542b732d619d5ac9192fe26180003ee 100644 (file)
@@ -457,8 +457,8 @@ extern void smu_poll(void);
  */
 extern int smu_init(void);
 extern int smu_present(void);
-struct of_device;
-extern struct of_device *smu_get_ofdev(void);
+struct platform_device;
+extern struct platform_device *smu_get_ofdev(void);
 
 
 /*
index 3033c1b307456e6e0ea53b6eea3910d0d2be9223..afe4aaa65c3b65b103b4a5f71e057f365b32ae65 100644 (file)
@@ -41,8 +41,6 @@ static inline int cpu_to_node(int cpu)
                               cpu_all_mask :                           \
                               node_to_cpumask_map[node])
 
-int of_node_to_nid(struct device_node *device);
-
 struct pci_bus;
 #ifdef CONFIG_PCI
 extern int pcibus_to_node(struct pci_bus *bus);
@@ -97,11 +95,6 @@ extern void sysfs_remove_device_from_node(struct sys_device *dev, int nid);
 
 #else
 
-static inline int of_node_to_nid(struct device_node *device)
-{
-       return 0;
-}
-
 static inline void dump_numa_cpu_topology(void) {}
 
 static inline int sysfs_add_device_to_node(struct sys_device *dev, int nid)
index 77d831a1cc32549dc4f528c43297f8230cf9bb05..1dda70129141d04656c65c3af27389491c5c9261 100644 (file)
@@ -41,7 +41,7 @@ obj-$(CONFIG_PPC_BOOK3E_64)   += exceptions-64e.o idle_book3e.o
 obj-$(CONFIG_PPC64)            += vdso64/
 obj-$(CONFIG_ALTIVEC)          += vecemu.o
 obj-$(CONFIG_PPC_970_NAP)      += idle_power4.o
-obj-$(CONFIG_PPC_OF)           += of_device.o of_platform.o prom_parse.o
+obj-$(CONFIG_PPC_OF)           += of_platform.o prom_parse.o
 obj-$(CONFIG_PPC_CLOCK)                += clock.o
 procfs-y                       := proc_powerpc.o
 obj-$(CONFIG_PROC_FS)          += $(procfs-y)
index 02f724f367533ee60f6512a7453cb0f0e3024fbc..4295e0b94b2db31238f008c49756955fd4922702 100644 (file)
@@ -82,17 +82,9 @@ static struct notifier_block ppc_swiotlb_plat_bus_notifier = {
        .priority = 0,
 };
 
-static struct notifier_block ppc_swiotlb_of_bus_notifier = {
-       .notifier_call = ppc_swiotlb_bus_notify,
-       .priority = 0,
-};
-
 int __init swiotlb_setup_bus_notifier(void)
 {
        bus_register_notifier(&platform_bus_type,
                              &ppc_swiotlb_plat_bus_notifier);
-       bus_register_notifier(&of_platform_bus_type,
-                             &ppc_swiotlb_of_bus_notifier);
-
        return 0;
 }
index 21266abfbda64cb0a11fd2a10aa8f1af47c574a1..9b626cfffce17d2a8c487c15f50bdd5bc229695f 100644 (file)
@@ -140,19 +140,19 @@ static struct dma_map_ops ibmebus_dma_ops = {
 
 static int ibmebus_match_path(struct device *dev, void *data)
 {
-       struct device_node *dn = to_of_device(dev)->dev.of_node;
+       struct device_node *dn = to_platform_device(dev)->dev.of_node;
        return (dn->full_name &&
                (strcasecmp((char *)data, dn->full_name) == 0));
 }
 
 static int ibmebus_match_node(struct device *dev, void *data)
 {
-       return to_of_device(dev)->dev.of_node == data;
+       return to_platform_device(dev)->dev.of_node == data;
 }
 
 static int ibmebus_create_device(struct device_node *dn)
 {
-       struct of_device *dev;
+       struct platform_device *dev;
        int ret;
 
        dev = of_device_alloc(dn, NULL, &ibmebus_bus_device);
@@ -298,7 +298,7 @@ static ssize_t ibmebus_store_remove(struct bus_type *bus,
 
        if ((dev = bus_find_device(&ibmebus_bus_type, NULL, path,
                                   ibmebus_match_path))) {
-               of_device_unregister(to_of_device(dev));
+               of_device_unregister(to_platform_device(dev));
 
                kfree(path);
                return count;
index 8f96d3198905150a2a325ad0297f8d14336ef587..d3ce67cf03be35855394905009d6a39729f7ac92 100644 (file)
@@ -53,6 +53,8 @@
 #include <linux/bootmem.h>
 #include <linux/pci.h>
 #include <linux/debugfs.h>
+#include <linux/of.h>
+#include <linux/of_irq.h>
 
 #include <asm/uaccess.h>
 #include <asm/system.h>
@@ -820,18 +822,6 @@ unsigned int irq_create_of_mapping(struct device_node *controller,
 }
 EXPORT_SYMBOL_GPL(irq_create_of_mapping);
 
-unsigned int irq_of_parse_and_map(struct device_node *dev, int index)
-{
-       struct of_irq oirq;
-
-       if (of_irq_map_one(dev, index, &oirq))
-               return NO_IRQ;
-
-       return irq_create_of_mapping(oirq.controller, oirq.specifier,
-                                    oirq.size);
-}
-EXPORT_SYMBOL_GPL(irq_of_parse_and_map);
-
 void irq_dispose_mapping(unsigned int virq)
 {
        struct irq_host *host;
index 035ada5443ee4e17cc6c0fc3fd2165505820b43e..c1fd0f9658fd715536b3b2a7ce57ca34de67eee4 100644 (file)
@@ -4,6 +4,7 @@
 #include <linux/serial_core.h>
 #include <linux/console.h>
 #include <linux/pci.h>
+#include <linux/of_address.h>
 #include <linux/of_device.h>
 #include <asm/io.h>
 #include <asm/mmu.h>
diff --git a/arch/powerpc/kernel/of_device.c b/arch/powerpc/kernel/of_device.c
deleted file mode 100644 (file)
index df78e02..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-#include <linux/string.h>
-#include <linux/kernel.h>
-#include <linux/of.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/mod_devicetable.h>
-#include <linux/slab.h>
-#include <linux/of_device.h>
-
-#include <asm/errno.h>
-#include <asm/dcr.h>
-
-static void of_device_make_bus_id(struct of_device *dev)
-{
-       static atomic_t bus_no_reg_magic;
-       struct device_node *node = dev->dev.of_node;
-       const u32 *reg;
-       u64 addr;
-       int magic;
-
-       /*
-        * If it's a DCR based device, use 'd' for native DCRs
-        * and 'D' for MMIO DCRs.
-        */
-#ifdef CONFIG_PPC_DCR
-       reg = of_get_property(node, "dcr-reg", NULL);
-       if (reg) {
-#ifdef CONFIG_PPC_DCR_NATIVE
-               dev_set_name(&dev->dev, "d%x.%s", *reg, node->name);
-#else /* CONFIG_PPC_DCR_NATIVE */
-               addr = of_translate_dcr_address(node, *reg, NULL);
-               if (addr != OF_BAD_ADDR) {
-                       dev_set_name(&dev->dev, "D%llx.%s",
-                                    (unsigned long long)addr, node->name);
-                       return;
-               }
-#endif /* !CONFIG_PPC_DCR_NATIVE */
-       }
-#endif /* CONFIG_PPC_DCR */
-
-       /*
-        * For MMIO, get the physical address
-        */
-       reg = of_get_property(node, "reg", NULL);
-       if (reg) {
-               addr = of_translate_address(node, reg);
-               if (addr != OF_BAD_ADDR) {
-                       dev_set_name(&dev->dev, "%llx.%s",
-                                    (unsigned long long)addr, node->name);
-                       return;
-               }
-       }
-
-       /*
-        * No BusID, use the node name and add a globally incremented
-        * counter (and pray...)
-        */
-       magic = atomic_add_return(1, &bus_no_reg_magic);
-       dev_set_name(&dev->dev, "%s.%d", node->name, magic - 1);
-}
-
-struct of_device *of_device_alloc(struct device_node *np,
-                                 const char *bus_id,
-                                 struct device *parent)
-{
-       struct of_device *dev;
-
-       dev = kzalloc(sizeof(*dev), GFP_KERNEL);
-       if (!dev)
-               return NULL;
-
-       dev->dev.of_node = of_node_get(np);
-       dev->dev.dma_mask = &dev->archdata.dma_mask;
-       dev->dev.parent = parent;
-       dev->dev.release = of_release_dev;
-
-       if (bus_id)
-               dev_set_name(&dev->dev, "%s", bus_id);
-       else
-               of_device_make_bus_id(dev);
-
-       return dev;
-}
-EXPORT_SYMBOL(of_device_alloc);
-
-int of_device_uevent(struct device *dev, struct kobj_uevent_env *env)
-{
-       struct of_device *ofdev;
-       const char *compat;
-       int seen = 0, cplen, sl;
-
-       if (!dev)
-               return -ENODEV;
-
-       ofdev = to_of_device(dev);
-
-       if (add_uevent_var(env, "OF_NAME=%s", ofdev->dev.of_node->name))
-               return -ENOMEM;
-
-       if (add_uevent_var(env, "OF_TYPE=%s", ofdev->dev.of_node->type))
-               return -ENOMEM;
-
-        /* Since the compatible field can contain pretty much anything
-         * it's not really legal to split it out with commas. We split it
-         * up using a number of environment variables instead. */
-
-       compat = of_get_property(ofdev->dev.of_node, "compatible", &cplen);
-       while (compat && *compat && cplen > 0) {
-               if (add_uevent_var(env, "OF_COMPATIBLE_%d=%s", seen, compat))
-                       return -ENOMEM;
-
-               sl = strlen (compat) + 1;
-               compat += sl;
-               cplen -= sl;
-               seen++;
-       }
-
-       if (add_uevent_var(env, "OF_COMPATIBLE_N=%d", seen))
-               return -ENOMEM;
-
-       /* modalias is trickier, we add it in 2 steps */
-       if (add_uevent_var(env, "MODALIAS="))
-               return -ENOMEM;
-       sl = of_device_get_modalias(ofdev, &env->buf[env->buflen-1],
-                                   sizeof(env->buf) - env->buflen);
-       if (sl >= (sizeof(env->buf) - env->buflen))
-               return -ENOMEM;
-       env->buflen += sl;
-
-       return 0;
-}
-EXPORT_SYMBOL(of_device_uevent);
-EXPORT_SYMBOL(of_device_get_modalias);
index 487a98851ba6f04f24fd50d200f712ba29df46ac..b2c363ef38ad7dce344c9058abdad4563e911b21 100644 (file)
 #include <asm/ppc-pci.h>
 #include <asm/atomic.h>
 
-/*
- * The list of OF IDs below is used for matching bus types in the
- * system whose devices are to be exposed as of_platform_devices.
- *
- * This is the default list valid for most platforms. This file provides
- * functions who can take an explicit list if necessary though
- *
- * The search is always performed recursively looking for children of
- * the provided device_node and recursively if such a children matches
- * a bus type in the list
- */
-
-static const struct of_device_id of_default_bus_ids[] = {
-       { .type = "soc", },
-       { .compatible = "soc", },
-       { .type = "spider", },
-       { .type = "axon", },
-       { .type = "plb5", },
-       { .type = "plb4", },
-       { .type = "opb", },
-       { .type = "ebc", },
-       {},
-};
-
-struct bus_type of_platform_bus_type = {
-       .uevent = of_device_uevent,
-};
-EXPORT_SYMBOL(of_platform_bus_type);
-
-static int __init of_bus_driver_init(void)
-{
-       return of_bus_type_init(&of_platform_bus_type, "of_platform");
-}
-
-postcore_initcall(of_bus_driver_init);
-
-struct of_device* of_platform_device_create(struct device_node *np,
-                                           const char *bus_id,
-                                           struct device *parent)
-{
-       struct of_device *dev;
-
-       dev = of_device_alloc(np, bus_id, parent);
-       if (!dev)
-               return NULL;
-
-       dev->archdata.dma_mask = 0xffffffffUL;
-       dev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
-
-       dev->dev.bus = &of_platform_bus_type;
-
-       /* We do not fill the DMA ops for platform devices by default.
-        * This is currently the responsibility of the platform code
-        * to do such, possibly using a device notifier
-        */
-
-       if (of_device_register(dev) != 0) {
-               of_device_free(dev);
-               return NULL;
-       }
-
-       return dev;
-}
-EXPORT_SYMBOL(of_platform_device_create);
-
-
-
-/**
- * of_platform_bus_create - Create an OF device for a bus node and all its
- * children. Optionally recursively instanciate matching busses.
- * @bus: device node of the bus to instanciate
- * @matches: match table, NULL to use the default, OF_NO_DEEP_PROBE to
- * disallow recursive creation of child busses
- */
-static int of_platform_bus_create(const struct device_node *bus,
-                                 const struct of_device_id *matches,
-                                 struct device *parent)
-{
-       struct device_node *child;
-       struct of_device *dev;
-       int rc = 0;
-
-       for_each_child_of_node(bus, child) {
-               pr_debug("   create child: %s\n", child->full_name);
-               dev = of_platform_device_create(child, NULL, parent);
-               if (dev == NULL)
-                       rc = -ENOMEM;
-               else if (!of_match_node(matches, child))
-                       continue;
-               if (rc == 0) {
-                       pr_debug("   and sub busses\n");
-                       rc = of_platform_bus_create(child, matches, &dev->dev);
-               } if (rc) {
-                       of_node_put(child);
-                       break;
-               }
-       }
-       return rc;
-}
-
-/**
- * of_platform_bus_probe - Probe the device-tree for platform busses
- * @root: parent of the first level to probe or NULL for the root of the tree
- * @matches: match table, NULL to use the default
- * @parent: parent to hook devices from, NULL for toplevel
- *
- * Note that children of the provided root are not instanciated as devices
- * unless the specified root itself matches the bus list and is not NULL.
- */
-
-int of_platform_bus_probe(struct device_node *root,
-                         const struct of_device_id *matches,
-                         struct device *parent)
-{
-       struct device_node *child;
-       struct of_device *dev;
-       int rc = 0;
-
-       if (matches == NULL)
-               matches = of_default_bus_ids;
-       if (matches == OF_NO_DEEP_PROBE)
-               return -EINVAL;
-       if (root == NULL)
-               root = of_find_node_by_path("/");
-       else
-               of_node_get(root);
-
-       pr_debug("of_platform_bus_probe()\n");
-       pr_debug(" starting at: %s\n", root->full_name);
-
-       /* Do a self check of bus type, if there's a match, create
-        * children
-        */
-       if (of_match_node(matches, root)) {
-               pr_debug(" root match, create all sub devices\n");
-               dev = of_platform_device_create(root, NULL, parent);
-               if (dev == NULL) {
-                       rc = -ENOMEM;
-                       goto bail;
-               }
-               pr_debug(" create all sub busses\n");
-               rc = of_platform_bus_create(root, matches, &dev->dev);
-               goto bail;
-       }
-       for_each_child_of_node(root, child) {
-               if (!of_match_node(matches, child))
-                       continue;
-
-               pr_debug("  match: %s\n", child->full_name);
-               dev = of_platform_device_create(child, NULL, parent);
-               if (dev == NULL)
-                       rc = -ENOMEM;
-               else
-                       rc = of_platform_bus_create(child, matches, &dev->dev);
-               if (rc) {
-                       of_node_put(child);
-                       break;
-               }
-       }
- bail:
-       of_node_put(root);
-       return rc;
-}
-EXPORT_SYMBOL(of_platform_bus_probe);
-
-static int of_dev_node_match(struct device *dev, void *data)
-{
-       return to_of_device(dev)->dev.of_node == data;
-}
-
-struct of_device *of_find_device_by_node(struct device_node *np)
-{
-       struct device *dev;
-
-       dev = bus_find_device(&of_platform_bus_type,
-                             NULL, np, of_dev_node_match);
-       if (dev)
-               return to_of_device(dev);
-       return NULL;
-}
-EXPORT_SYMBOL(of_find_device_by_node);
-
-static int of_dev_phandle_match(struct device *dev, void *data)
-{
-       phandle *ph = data;
-       return to_of_device(dev)->dev.of_node->phandle == *ph;
-}
-
-struct of_device *of_find_device_by_phandle(phandle ph)
-{
-       struct device *dev;
-
-       dev = bus_find_device(&of_platform_bus_type,
-                             NULL, &ph, of_dev_phandle_match);
-       if (dev)
-               return to_of_device(dev);
-       return NULL;
-}
-EXPORT_SYMBOL(of_find_device_by_phandle);
-
-
 #ifdef CONFIG_PPC_OF_PLATFORM_PCI
 
 /* The probing of PCI controllers from of_platform is currently
@@ -237,7 +36,7 @@ EXPORT_SYMBOL(of_find_device_by_phandle);
  * lacking some bits needed here.
  */
 
-static int __devinit of_pci_phb_probe(struct of_device *dev,
+static int __devinit of_pci_phb_probe(struct platform_device *dev,
                                      const struct of_device_id *match)
 {
        struct pci_controller *phb;
index 5b38f6ae2b299695139c25a21cff0b73f8857808..9021c4ad4bbd3ebdcda00af9de8bf59e6bfacc83 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/string.h>
 #include <linux/init.h>
 #include <linux/bootmem.h>
+#include <linux/of_address.h>
 #include <linux/mm.h>
 #include <linux/list.h>
 #include <linux/syscalls.h>
index 8362620c9e6f449962b111f1537e767e87ea9df7..88334af038e58453dc2fc8d5cbb12bad0fc175e9 100644 (file)
 #include <linux/module.h>
 #include <linux/ioport.h>
 #include <linux/etherdevice.h>
+#include <linux/of_address.h>
 #include <asm/prom.h>
 #include <asm/pci-bridge.h>
 
-#ifdef DEBUG
-#define DBG(fmt...) do { printk(fmt); } while(0)
-#else
-#define DBG(fmt...) do { } while(0)
-#endif
-
-#ifdef CONFIG_PPC64
-#define PRu64  "%lx"
-#else
-#define PRu64  "%llx"
-#endif
-
-/* Max address size we deal with */
-#define OF_MAX_ADDR_CELLS      4
-#define OF_CHECK_COUNTS(na, ns)        ((na) > 0 && (na) <= OF_MAX_ADDR_CELLS && \
-                       (ns) > 0)
-
-static struct of_bus *of_match_bus(struct device_node *np);
-static int __of_address_to_resource(struct device_node *dev,
-               const u32 *addrp, u64 size, unsigned int flags,
-               struct resource *r);
-
-
-/* Debug utility */
-#ifdef DEBUG
-static void of_dump_addr(const char *s, const u32 *addr, int na)
-{
-       printk("%s", s);
-       while(na--)
-               printk(" %08x", *(addr++));
-       printk("\n");
-}
-#else
-static void of_dump_addr(const char *s, const u32 *addr, int na) { }
-#endif
-
-
-/* Callbacks for bus specific translators */
-struct of_bus {
-       const char      *name;
-       const char      *addresses;
-       int             (*match)(struct device_node *parent);
-       void            (*count_cells)(struct device_node *child,
-                                      int *addrc, int *sizec);
-       u64             (*map)(u32 *addr, const u32 *range,
-                               int na, int ns, int pna);
-       int             (*translate)(u32 *addr, u64 offset, int na);
-       unsigned int    (*get_flags)(const u32 *addr);
-};
-
-
-/*
- * Default translator (generic bus)
- */
-
-static void of_bus_default_count_cells(struct device_node *dev,
-                                      int *addrc, int *sizec)
-{
-       if (addrc)
-               *addrc = of_n_addr_cells(dev);
-       if (sizec)
-               *sizec = of_n_size_cells(dev);
-}
-
-static u64 of_bus_default_map(u32 *addr, const u32 *range,
-               int na, int ns, int pna)
-{
-       u64 cp, s, da;
-
-       cp = of_read_number(range, na);
-       s  = of_read_number(range + na + pna, ns);
-       da = of_read_number(addr, na);
-
-       DBG("OF: default map, cp="PRu64", s="PRu64", da="PRu64"\n",
-           cp, s, da);
-
-       if (da < cp || da >= (cp + s))
-               return OF_BAD_ADDR;
-       return da - cp;
-}
-
-static int of_bus_default_translate(u32 *addr, u64 offset, int na)
-{
-       u64 a = of_read_number(addr, na);
-       memset(addr, 0, na * 4);
-       a += offset;
-       if (na > 1)
-               addr[na - 2] = a >> 32;
-       addr[na - 1] = a & 0xffffffffu;
-
-       return 0;
-}
-
-static unsigned int of_bus_default_get_flags(const u32 *addr)
-{
-       return IORESOURCE_MEM;
-}
-
-
 #ifdef CONFIG_PCI
-/*
- * PCI bus specific translator
- */
-
-static int of_bus_pci_match(struct device_node *np)
-{
-       /* "vci" is for the /chaos bridge on 1st-gen PCI powermacs */
-       return !strcmp(np->type, "pci") || !strcmp(np->type, "vci");
-}
-
-static void of_bus_pci_count_cells(struct device_node *np,
-                                  int *addrc, int *sizec)
-{
-       if (addrc)
-               *addrc = 3;
-       if (sizec)
-               *sizec = 2;
-}
-
-static unsigned int of_bus_pci_get_flags(const u32 *addr)
-{
-       unsigned int flags = 0;
-       u32 w = addr[0];
-
-       switch((w >> 24) & 0x03) {
-       case 0x01:
-               flags |= IORESOURCE_IO;
-               break;
-       case 0x02: /* 32 bits */
-       case 0x03: /* 64 bits */
-               flags |= IORESOURCE_MEM;
-               break;
-       }
-       if (w & 0x40000000)
-               flags |= IORESOURCE_PREFETCH;
-       return flags;
-}
-
-static u64 of_bus_pci_map(u32 *addr, const u32 *range, int na, int ns, int pna)
-{
-       u64 cp, s, da;
-       unsigned int af, rf;
-
-       af = of_bus_pci_get_flags(addr);
-       rf = of_bus_pci_get_flags(range);
-
-       /* Check address type match */
-       if ((af ^ rf) & (IORESOURCE_MEM | IORESOURCE_IO))
-               return OF_BAD_ADDR;
-
-       /* Read address values, skipping high cell */
-       cp = of_read_number(range + 1, na - 1);
-       s  = of_read_number(range + na + pna, ns);
-       da = of_read_number(addr + 1, na - 1);
-
-       DBG("OF: PCI map, cp="PRu64", s="PRu64", da="PRu64"\n", cp, s, da);
-
-       if (da < cp || da >= (cp + s))
-               return OF_BAD_ADDR;
-       return da - cp;
-}
-
-static int of_bus_pci_translate(u32 *addr, u64 offset, int na)
-{
-       return of_bus_default_translate(addr + 1, offset, na - 1);
-}
-
-const u32 *of_get_pci_address(struct device_node *dev, int bar_no, u64 *size,
-                       unsigned int *flags)
-{
-       const u32 *prop;
-       unsigned int psize;
-       struct device_node *parent;
-       struct of_bus *bus;
-       int onesize, i, na, ns;
-
-       /* Get parent & match bus type */
-       parent = of_get_parent(dev);
-       if (parent == NULL)
-               return NULL;
-       bus = of_match_bus(parent);
-       if (strcmp(bus->name, "pci")) {
-               of_node_put(parent);
-               return NULL;
-       }
-       bus->count_cells(dev, &na, &ns);
-       of_node_put(parent);
-       if (!OF_CHECK_COUNTS(na, ns))
-               return NULL;
-
-       /* Get "reg" or "assigned-addresses" property */
-       prop = of_get_property(dev, bus->addresses, &psize);
-       if (prop == NULL)
-               return NULL;
-       psize /= 4;
-
-       onesize = na + ns;
-       for (i = 0; psize >= onesize; psize -= onesize, prop += onesize, i++)
-               if ((prop[0] & 0xff) == ((bar_no * 4) + PCI_BASE_ADDRESS_0)) {
-                       if (size)
-                               *size = of_read_number(prop + na, ns);
-                       if (flags)
-                               *flags = bus->get_flags(prop);
-                       return prop;
-               }
-       return NULL;
-}
-EXPORT_SYMBOL(of_get_pci_address);
-
-int of_pci_address_to_resource(struct device_node *dev, int bar,
-                              struct resource *r)
-{
-       const u32       *addrp;
-       u64             size;
-       unsigned int    flags;
-
-       addrp = of_get_pci_address(dev, bar, &size, &flags);
-       if (addrp == NULL)
-               return -EINVAL;
-       return __of_address_to_resource(dev, addrp, size, flags, r);
-}
-EXPORT_SYMBOL_GPL(of_pci_address_to_resource);
-
 int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq)
 {
        struct device_node *dn, *ppnode;
@@ -313,345 +92,6 @@ int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq)
 EXPORT_SYMBOL_GPL(of_irq_map_pci);
 #endif /* CONFIG_PCI */
 
-/*
- * ISA bus specific translator
- */
-
-static int of_bus_isa_match(struct device_node *np)
-{
-       return !strcmp(np->name, "isa");
-}
-
-static void of_bus_isa_count_cells(struct device_node *child,
-                                  int *addrc, int *sizec)
-{
-       if (addrc)
-               *addrc = 2;
-       if (sizec)
-               *sizec = 1;
-}
-
-static u64 of_bus_isa_map(u32 *addr, const u32 *range, int na, int ns, int pna)
-{
-       u64 cp, s, da;
-
-       /* Check address type match */
-       if ((addr[0] ^ range[0]) & 0x00000001)
-               return OF_BAD_ADDR;
-
-       /* Read address values, skipping high cell */
-       cp = of_read_number(range + 1, na - 1);
-       s  = of_read_number(range + na + pna, ns);
-       da = of_read_number(addr + 1, na - 1);
-
-       DBG("OF: ISA map, cp="PRu64", s="PRu64", da="PRu64"\n", cp, s, da);
-
-       if (da < cp || da >= (cp + s))
-               return OF_BAD_ADDR;
-       return da - cp;
-}
-
-static int of_bus_isa_translate(u32 *addr, u64 offset, int na)
-{
-       return of_bus_default_translate(addr + 1, offset, na - 1);
-}
-
-static unsigned int of_bus_isa_get_flags(const u32 *addr)
-{
-       unsigned int flags = 0;
-       u32 w = addr[0];
-
-       if (w & 1)
-               flags |= IORESOURCE_IO;
-       else
-               flags |= IORESOURCE_MEM;
-       return flags;
-}
-
-
-/*
- * Array of bus specific translators
- */
-
-static struct of_bus of_busses[] = {
-#ifdef CONFIG_PCI
-       /* PCI */
-       {
-               .name = "pci",
-               .addresses = "assigned-addresses",
-               .match = of_bus_pci_match,
-               .count_cells = of_bus_pci_count_cells,
-               .map = of_bus_pci_map,
-               .translate = of_bus_pci_translate,
-               .get_flags = of_bus_pci_get_flags,
-       },
-#endif /* CONFIG_PCI */
-       /* ISA */
-       {
-               .name = "isa",
-               .addresses = "reg",
-               .match = of_bus_isa_match,
-               .count_cells = of_bus_isa_count_cells,
-               .map = of_bus_isa_map,
-               .translate = of_bus_isa_translate,
-               .get_flags = of_bus_isa_get_flags,
-       },
-       /* Default */
-       {
-               .name = "default",
-               .addresses = "reg",
-               .match = NULL,
-               .count_cells = of_bus_default_count_cells,
-               .map = of_bus_default_map,
-               .translate = of_bus_default_translate,
-               .get_flags = of_bus_default_get_flags,
-       },
-};
-
-static struct of_bus *of_match_bus(struct device_node *np)
-{
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(of_busses); i ++)
-               if (!of_busses[i].match || of_busses[i].match(np))
-                       return &of_busses[i];
-       BUG();
-       return NULL;
-}
-
-static int of_translate_one(struct device_node *parent, struct of_bus *bus,
-                           struct of_bus *pbus, u32 *addr,
-                           int na, int ns, int pna, const char *rprop)
-{
-       const u32 *ranges;
-       unsigned int rlen;
-       int rone;
-       u64 offset = OF_BAD_ADDR;
-
-       /* Normally, an absence of a "ranges" property means we are
-        * crossing a non-translatable boundary, and thus the addresses
-        * below the current not cannot be converted to CPU physical ones.
-        * Unfortunately, while this is very clear in the spec, it's not
-        * what Apple understood, and they do have things like /uni-n or
-        * /ht nodes with no "ranges" property and a lot of perfectly
-        * useable mapped devices below them. Thus we treat the absence of
-        * "ranges" as equivalent to an empty "ranges" property which means
-        * a 1:1 translation at that level. It's up to the caller not to try
-        * to translate addresses that aren't supposed to be translated in
-        * the first place. --BenH.
-        */
-       ranges = of_get_property(parent, rprop, &rlen);
-       if (ranges == NULL || rlen == 0) {
-               offset = of_read_number(addr, na);
-               memset(addr, 0, pna * 4);
-               DBG("OF: no ranges, 1:1 translation\n");
-               goto finish;
-       }
-
-       DBG("OF: walking ranges...\n");
-
-       /* Now walk through the ranges */
-       rlen /= 4;
-       rone = na + pna + ns;
-       for (; rlen >= rone; rlen -= rone, ranges += rone) {
-               offset = bus->map(addr, ranges, na, ns, pna);
-               if (offset != OF_BAD_ADDR)
-                       break;
-       }
-       if (offset == OF_BAD_ADDR) {
-               DBG("OF: not found !\n");
-               return 1;
-       }
-       memcpy(addr, ranges + na, 4 * pna);
-
- finish:
-       of_dump_addr("OF: parent translation for:", addr, pna);
-       DBG("OF: with offset: "PRu64"\n", offset);
-
-       /* Translate it into parent bus space */
-       return pbus->translate(addr, offset, pna);
-}
-
-
-/*
- * Translate an address from the device-tree into a CPU physical address,
- * this walks up the tree and applies the various bus mappings on the
- * way.
- *
- * Note: We consider that crossing any level with #size-cells == 0 to mean
- * that translation is impossible (that is we are not dealing with a value
- * that can be mapped to a cpu physical address). This is not really specified
- * that way, but this is traditionally the way IBM at least do things
- */
-u64 __of_translate_address(struct device_node *dev, const u32 *in_addr,
-                          const char *rprop)
-{
-       struct device_node *parent = NULL;
-       struct of_bus *bus, *pbus;
-       u32 addr[OF_MAX_ADDR_CELLS];
-       int na, ns, pna, pns;
-       u64 result = OF_BAD_ADDR;
-
-       DBG("OF: ** translation for device %s **\n", dev->full_name);
-
-       /* Increase refcount at current level */
-       of_node_get(dev);
-
-       /* Get parent & match bus type */
-       parent = of_get_parent(dev);
-       if (parent == NULL)
-               goto bail;
-       bus = of_match_bus(parent);
-
-       /* Cound address cells & copy address locally */
-       bus->count_cells(dev, &na, &ns);
-       if (!OF_CHECK_COUNTS(na, ns)) {
-               printk(KERN_ERR "prom_parse: Bad cell count for %s\n",
-                      dev->full_name);
-               goto bail;
-       }
-       memcpy(addr, in_addr, na * 4);
-
-       DBG("OF: bus is %s (na=%d, ns=%d) on %s\n",
-           bus->name, na, ns, parent->full_name);
-       of_dump_addr("OF: translating address:", addr, na);
-
-       /* Translate */
-       for (;;) {
-               /* Switch to parent bus */
-               of_node_put(dev);
-               dev = parent;
-               parent = of_get_parent(dev);
-
-               /* If root, we have finished */
-               if (parent == NULL) {
-                       DBG("OF: reached root node\n");
-                       result = of_read_number(addr, na);
-                       break;
-               }
-
-               /* Get new parent bus and counts */
-               pbus = of_match_bus(parent);
-               pbus->count_cells(dev, &pna, &pns);
-               if (!OF_CHECK_COUNTS(pna, pns)) {
-                       printk(KERN_ERR "prom_parse: Bad cell count for %s\n",
-                              dev->full_name);
-                       break;
-               }
-
-               DBG("OF: parent bus is %s (na=%d, ns=%d) on %s\n",
-                   pbus->name, pna, pns, parent->full_name);
-
-               /* Apply bus translation */
-               if (of_translate_one(dev, bus, pbus, addr, na, ns, pna, rprop))
-                       break;
-
-               /* Complete the move up one level */
-               na = pna;
-               ns = pns;
-               bus = pbus;
-
-               of_dump_addr("OF: one level translation:", addr, na);
-       }
- bail:
-       of_node_put(parent);
-       of_node_put(dev);
-
-       return result;
-}
-
-u64 of_translate_address(struct device_node *dev, const u32 *in_addr)
-{
-       return __of_translate_address(dev, in_addr, "ranges");
-}
-EXPORT_SYMBOL(of_translate_address);
-
-u64 of_translate_dma_address(struct device_node *dev, const u32 *in_addr)
-{
-       return __of_translate_address(dev, in_addr, "dma-ranges");
-}
-EXPORT_SYMBOL(of_translate_dma_address);
-
-const u32 *of_get_address(struct device_node *dev, int index, u64 *size,
-                   unsigned int *flags)
-{
-       const u32 *prop;
-       unsigned int psize;
-       struct device_node *parent;
-       struct of_bus *bus;
-       int onesize, i, na, ns;
-
-       /* Get parent & match bus type */
-       parent = of_get_parent(dev);
-       if (parent == NULL)
-               return NULL;
-       bus = of_match_bus(parent);
-       bus->count_cells(dev, &na, &ns);
-       of_node_put(parent);
-       if (!OF_CHECK_COUNTS(na, ns))
-               return NULL;
-
-       /* Get "reg" or "assigned-addresses" property */
-       prop = of_get_property(dev, bus->addresses, &psize);
-       if (prop == NULL)
-               return NULL;
-       psize /= 4;
-
-       onesize = na + ns;
-       for (i = 0; psize >= onesize; psize -= onesize, prop += onesize, i++)
-               if (i == index) {
-                       if (size)
-                               *size = of_read_number(prop + na, ns);
-                       if (flags)
-                               *flags = bus->get_flags(prop);
-                       return prop;
-               }
-       return NULL;
-}
-EXPORT_SYMBOL(of_get_address);
-
-static int __of_address_to_resource(struct device_node *dev, const u32 *addrp,
-                                   u64 size, unsigned int flags,
-                                   struct resource *r)
-{
-       u64 taddr;
-
-       if ((flags & (IORESOURCE_IO | IORESOURCE_MEM)) == 0)
-               return -EINVAL;
-       taddr = of_translate_address(dev, addrp);
-       if (taddr == OF_BAD_ADDR)
-               return -EINVAL;
-       memset(r, 0, sizeof(struct resource));
-       if (flags & IORESOURCE_IO) {
-               unsigned long port;
-               port = pci_address_to_pio(taddr);
-               if (port == (unsigned long)-1)
-                       return -EINVAL;
-               r->start = port;
-               r->end = port + size - 1;
-       } else {
-               r->start = taddr;
-               r->end = taddr + size - 1;
-       }
-       r->flags = flags;
-       r->name = dev->name;
-       return 0;
-}
-
-int of_address_to_resource(struct device_node *dev, int index,
-                          struct resource *r)
-{
-       const u32       *addrp;
-       u64             size;
-       unsigned int    flags;
-
-       addrp = of_get_address(dev, index, &size, &flags);
-       if (addrp == NULL)
-               return -EINVAL;
-       return __of_address_to_resource(dev, addrp, size, flags, r);
-}
-EXPORT_SYMBOL_GPL(of_address_to_resource);
-
 void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop,
                unsigned long *busno, unsigned long *phys, unsigned long *size)
 {
@@ -678,342 +118,6 @@ void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop,
        *size = of_read_number(dma_window, cells);
 }
 
-/*
- * Interrupt remapper
- */
-
-static unsigned int of_irq_workarounds;
-static struct device_node *of_irq_dflt_pic;
-
-static struct device_node *of_irq_find_parent(struct device_node *child)
-{
-       struct device_node *p;
-       const phandle *parp;
-
-       if (!of_node_get(child))
-               return NULL;
-
-       do {
-               parp = of_get_property(child, "interrupt-parent", NULL);
-               if (parp == NULL)
-                       p = of_get_parent(child);
-               else {
-                       if (of_irq_workarounds & OF_IMAP_NO_PHANDLE)
-                               p = of_node_get(of_irq_dflt_pic);
-                       else
-                               p = of_find_node_by_phandle(*parp);
-               }
-               of_node_put(child);
-               child = p;
-       } while (p && of_get_property(p, "#interrupt-cells", NULL) == NULL);
-
-       return p;
-}
-
-/* This doesn't need to be called if you don't have any special workaround
- * flags to pass
- */
-void of_irq_map_init(unsigned int flags)
-{
-       of_irq_workarounds = flags;
-
-       /* OldWorld, don't bother looking at other things */
-       if (flags & OF_IMAP_OLDWORLD_MAC)
-               return;
-
-       /* If we don't have phandles, let's try to locate a default interrupt
-        * controller (happens when booting with BootX). We do a first match
-        * here, hopefully, that only ever happens on machines with one
-        * controller.
-        */
-       if (flags & OF_IMAP_NO_PHANDLE) {
-               struct device_node *np;
-
-               for_each_node_with_property(np, "interrupt-controller") {
-                       /* Skip /chosen/interrupt-controller */
-                       if (strcmp(np->name, "chosen") == 0)
-                               continue;
-                       /* It seems like at least one person on this planet wants
-                        * to use BootX on a machine with an AppleKiwi controller
-                        * which happens to pretend to be an interrupt
-                        * controller too.
-                        */
-                       if (strcmp(np->name, "AppleKiwi") == 0)
-                               continue;
-                       /* I think we found one ! */
-                       of_irq_dflt_pic = np;
-                       break;
-               }
-       }
-
-}
-
-int of_irq_map_raw(struct device_node *parent, const u32 *intspec, u32 ointsize,
-               const u32 *addr, struct of_irq *out_irq)
-{
-       struct device_node *ipar, *tnode, *old = NULL, *newpar = NULL;
-       const u32 *tmp, *imap, *imask;
-       u32 intsize = 1, addrsize, newintsize = 0, newaddrsize = 0;
-       int imaplen, match, i;
-
-       DBG("of_irq_map_raw: par=%s,intspec=[0x%08x 0x%08x...],ointsize=%d\n",
-           parent->full_name, intspec[0], intspec[1], ointsize);
-
-       ipar = of_node_get(parent);
-
-       /* First get the #interrupt-cells property of the current cursor
-        * that tells us how to interpret the passed-in intspec. If there
-        * is none, we are nice and just walk up the tree
-        */
-       do {
-               tmp = of_get_property(ipar, "#interrupt-cells", NULL);
-               if (tmp != NULL) {
-                       intsize = *tmp;
-                       break;
-               }
-               tnode = ipar;
-               ipar = of_irq_find_parent(ipar);
-               of_node_put(tnode);
-       } while (ipar);
-       if (ipar == NULL) {
-               DBG(" -> no parent found !\n");
-               goto fail;
-       }
-
-       DBG("of_irq_map_raw: ipar=%s, size=%d\n", ipar->full_name, intsize);
-
-       if (ointsize != intsize)
-               return -EINVAL;
-
-       /* Look for this #address-cells. We have to implement the old linux
-        * trick of looking for the parent here as some device-trees rely on it
-        */
-       old = of_node_get(ipar);
-       do {
-               tmp = of_get_property(old, "#address-cells", NULL);
-               tnode = of_get_parent(old);
-               of_node_put(old);
-               old = tnode;
-       } while(old && tmp == NULL);
-       of_node_put(old);
-       old = NULL;
-       addrsize = (tmp == NULL) ? 2 : *tmp;
-
-       DBG(" -> addrsize=%d\n", addrsize);
-
-       /* Now start the actual "proper" walk of the interrupt tree */
-       while (ipar != NULL) {
-               /* Now check if cursor is an interrupt-controller and if it is
-                * then we are done
-                */
-               if (of_get_property(ipar, "interrupt-controller", NULL) !=
-                               NULL) {
-                       DBG(" -> got it !\n");
-                       memcpy(out_irq->specifier, intspec,
-                              intsize * sizeof(u32));
-                       out_irq->size = intsize;
-                       out_irq->controller = ipar;
-                       of_node_put(old);
-                       return 0;
-               }
-
-               /* Now look for an interrupt-map */
-               imap = of_get_property(ipar, "interrupt-map", &imaplen);
-               /* No interrupt map, check for an interrupt parent */
-               if (imap == NULL) {
-                       DBG(" -> no map, getting parent\n");
-                       newpar = of_irq_find_parent(ipar);
-                       goto skiplevel;
-               }
-               imaplen /= sizeof(u32);
-
-               /* Look for a mask */
-               imask = of_get_property(ipar, "interrupt-map-mask", NULL);
-
-               /* If we were passed no "reg" property and we attempt to parse
-                * an interrupt-map, then #address-cells must be 0.
-                * Fail if it's not.
-                */
-               if (addr == NULL && addrsize != 0) {
-                       DBG(" -> no reg passed in when needed !\n");
-                       goto fail;
-               }
-
-               /* Parse interrupt-map */
-               match = 0;
-               while (imaplen > (addrsize + intsize + 1) && !match) {
-                       /* Compare specifiers */
-                       match = 1;
-                       for (i = 0; i < addrsize && match; ++i) {
-                               u32 mask = imask ? imask[i] : 0xffffffffu;
-                               match = ((addr[i] ^ imap[i]) & mask) == 0;
-                       }
-                       for (; i < (addrsize + intsize) && match; ++i) {
-                               u32 mask = imask ? imask[i] : 0xffffffffu;
-                               match =
-                                  ((intspec[i-addrsize] ^ imap[i]) & mask) == 0;
-                       }
-                       imap += addrsize + intsize;
-                       imaplen -= addrsize + intsize;
-
-                       DBG(" -> match=%d (imaplen=%d)\n", match, imaplen);
-
-                       /* Get the interrupt parent */
-                       if (of_irq_workarounds & OF_IMAP_NO_PHANDLE)
-                               newpar = of_node_get(of_irq_dflt_pic);
-                       else
-                               newpar = of_find_node_by_phandle((phandle)*imap);
-                       imap++;
-                       --imaplen;
-
-                       /* Check if not found */
-                       if (newpar == NULL) {
-                               DBG(" -> imap parent not found !\n");
-                               goto fail;
-                       }
-
-                       /* Get #interrupt-cells and #address-cells of new
-                        * parent
-                        */
-                       tmp = of_get_property(newpar, "#interrupt-cells", NULL);
-                       if (tmp == NULL) {
-                               DBG(" -> parent lacks #interrupt-cells !\n");
-                               goto fail;
-                       }
-                       newintsize = *tmp;
-                       tmp = of_get_property(newpar, "#address-cells", NULL);
-                       newaddrsize = (tmp == NULL) ? 0 : *tmp;
-
-                       DBG(" -> newintsize=%d, newaddrsize=%d\n",
-                           newintsize, newaddrsize);
-
-                       /* Check for malformed properties */
-                       if (imaplen < (newaddrsize + newintsize))
-                               goto fail;
-
-                       imap += newaddrsize + newintsize;
-                       imaplen -= newaddrsize + newintsize;
-
-                       DBG(" -> imaplen=%d\n", imaplen);
-               }
-               if (!match)
-                       goto fail;
-
-               of_node_put(old);
-               old = of_node_get(newpar);
-               addrsize = newaddrsize;
-               intsize = newintsize;
-               intspec = imap - intsize;
-               addr = intspec - addrsize;
-
-       skiplevel:
-               /* Iterate again with new parent */
-               DBG(" -> new parent: %s\n", newpar ? newpar->full_name : "<>");
-               of_node_put(ipar);
-               ipar = newpar;
-               newpar = NULL;
-       }
- fail:
-       of_node_put(ipar);
-       of_node_put(old);
-       of_node_put(newpar);
-
-       return -EINVAL;
-}
-EXPORT_SYMBOL_GPL(of_irq_map_raw);
-
-#if defined(CONFIG_PPC_PMAC) && defined(CONFIG_PPC32)
-static int of_irq_map_oldworld(struct device_node *device, int index,
-                              struct of_irq *out_irq)
-{
-       const u32 *ints = NULL;
-       int intlen;
-
-       /*
-        * Old machines just have a list of interrupt numbers
-        * and no interrupt-controller nodes. We also have dodgy
-        * cases where the APPL,interrupts property is completely
-        * missing behind pci-pci bridges and we have to get it
-        * from the parent (the bridge itself, as apple just wired
-        * everything together on these)
-        */
-       while (device) {
-               ints = of_get_property(device, "AAPL,interrupts", &intlen);
-               if (ints != NULL)
-                       break;
-               device = device->parent;
-               if (device && strcmp(device->type, "pci") != 0)
-                       break;
-       }
-       if (ints == NULL)
-               return -EINVAL;
-       intlen /= sizeof(u32);
-
-       if (index >= intlen)
-               return -EINVAL;
-
-       out_irq->controller = NULL;
-       out_irq->specifier[0] = ints[index];
-       out_irq->size = 1;
-
-       return 0;
-}
-#else /* defined(CONFIG_PPC_PMAC) && defined(CONFIG_PPC32) */
-static int of_irq_map_oldworld(struct device_node *device, int index,
-                              struct of_irq *out_irq)
-{
-       return -EINVAL;
-}
-#endif /* !(defined(CONFIG_PPC_PMAC) && defined(CONFIG_PPC32)) */
-
-int of_irq_map_one(struct device_node *device, int index, struct of_irq *out_irq)
-{
-       struct device_node *p;
-       const u32 *intspec, *tmp, *addr;
-       u32 intsize, intlen;
-       int res = -EINVAL;
-
-       DBG("of_irq_map_one: dev=%s, index=%d\n", device->full_name, index);
-
-       /* OldWorld mac stuff is "special", handle out of line */
-       if (of_irq_workarounds & OF_IMAP_OLDWORLD_MAC)
-               return of_irq_map_oldworld(device, index, out_irq);
-
-       /* Get the interrupts property */
-       intspec = of_get_property(device, "interrupts", &intlen);
-       if (intspec == NULL)
-               return -EINVAL;
-       intlen /= sizeof(u32);
-
-       /* Get the reg property (if any) */
-       addr = of_get_property(device, "reg", NULL);
-
-       /* Look for the interrupt parent. */
-       p = of_irq_find_parent(device);
-       if (p == NULL)
-               return -EINVAL;
-
-       /* Get size of interrupt specifier */
-       tmp = of_get_property(p, "#interrupt-cells", NULL);
-       if (tmp == NULL)
-               goto out;
-       intsize = *tmp;
-
-       DBG(" intsize=%d intlen=%d\n", intsize, intlen);
-
-       /* Check index */
-       if ((index + 1) * intsize > intlen)
-               goto out;
-
-       /* Get new specifier and map it */
-       res = of_irq_map_raw(p, intspec + index * intsize, intsize,
-                            addr, out_irq);
-out:
-       of_node_put(p);
-       return res;
-}
-EXPORT_SYMBOL_GPL(of_irq_map_one);
-
 /**
  * Search the device tree for the best MAC address to use.  'mac-address' is
  * checked first, because that is supposed to contain to "most recent" MAC
@@ -1051,29 +155,3 @@ const void *of_get_mac_address(struct device_node *np)
        return NULL;
 }
 EXPORT_SYMBOL(of_get_mac_address);
-
-int of_irq_to_resource(struct device_node *dev, int index, struct resource *r)
-{
-       int irq = irq_of_parse_and_map(dev, index);
-
-       /* Only dereference the resource if both the
-        * resource and the irq are valid. */
-       if (r && irq != NO_IRQ) {
-               r->start = r->end = irq;
-               r->flags = IORESOURCE_IRQ;
-       }
-
-       return irq;
-}
-EXPORT_SYMBOL_GPL(of_irq_to_resource);
-
-void __iomem *of_iomap(struct device_node *np, int index)
-{
-       struct resource res;
-
-       if (of_address_to_resource(np, index, &res))
-               return NULL;
-
-       return ioremap(res.start, 1 + res.end - res.start);
-}
-EXPORT_SYMBOL(of_iomap);
index 70decd8068ca2a7802ca6c77f9b4ddf24089a801..15ade0d7bbb274b6327abb79fd1a275da4956acb 100644 (file)
@@ -714,16 +714,9 @@ static struct notifier_block ppc_dflt_plat_bus_notifier = {
        .priority = INT_MAX,
 };
 
-static struct notifier_block ppc_dflt_of_bus_notifier = {
-       .notifier_call = ppc_dflt_bus_notify,
-       .priority = INT_MAX,
-};
-
 static int __init setup_bus_notifier(void)
 {
        bus_register_notifier(&platform_bus_type, &ppc_dflt_plat_bus_notifier);
-       bus_register_notifier(&of_platform_bus_type, &ppc_dflt_of_bus_notifier);
-
        return 0;
 }
 
index e1c5cd6650b12acea5b51d0e27f0fd995608c160..5b243bd3eb3b699ee6a0712340c9df51db2ed948 100644 (file)
@@ -678,7 +678,7 @@ static void psc_clks_init(void)
 {
        struct device_node *np;
        const u32 *cell_index;
-       struct of_device *ofdev;
+       struct platform_device *ofdev;
 
        for_each_compatible_node(np, NULL, "fsl,mpc5121-psc") {
                cell_index = of_get_property(np, "cell-index", NULL);
index 6d584f4e3c9a1032b98e22e8f96cb91900158edf..de55bc0584b5d6cadaa24572db3302dbd0ea19ea 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/init.h>
 #include <linux/pci.h>
 #include <linux/of.h>
+#include <linux/of_address.h>
 #include <linux/root_dev.h>
 #include <linux/initrd.h>
 #include <asm/time.h>
index ca5305a5bd61d8021c50dbb452db5adc376b4a0b..0dad9a935eb5f1f34d57c134c7441c3d26dfacdf 100644 (file)
@@ -147,26 +147,25 @@ mpc52xx_wkup_gpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)
        return 0;
 }
 
-static int __devinit mpc52xx_wkup_gpiochip_probe(struct of_device *ofdev,
+static int __devinit mpc52xx_wkup_gpiochip_probe(struct platform_device *ofdev,
                                        const struct of_device_id *match)
 {
        struct mpc52xx_gpiochip *chip;
        struct mpc52xx_gpio_wkup __iomem *regs;
-       struct of_gpio_chip *ofchip;
+       struct gpio_chip *gc;
        int ret;
 
        chip = kzalloc(sizeof(*chip), GFP_KERNEL);
        if (!chip)
                return -ENOMEM;
 
-       ofchip = &chip->mmchip.of_gc;
+       gc = &chip->mmchip.gc;
 
-       ofchip->gpio_cells          = 2;
-       ofchip->gc.ngpio            = 8;
-       ofchip->gc.direction_input  = mpc52xx_wkup_gpio_dir_in;
-       ofchip->gc.direction_output = mpc52xx_wkup_gpio_dir_out;
-       ofchip->gc.get              = mpc52xx_wkup_gpio_get;
-       ofchip->gc.set              = mpc52xx_wkup_gpio_set;
+       gc->ngpio            = 8;
+       gc->direction_input  = mpc52xx_wkup_gpio_dir_in;
+       gc->direction_output = mpc52xx_wkup_gpio_dir_out;
+       gc->get              = mpc52xx_wkup_gpio_get;
+       gc->set              = mpc52xx_wkup_gpio_set;
 
        ret = of_mm_gpiochip_add(ofdev->dev.of_node, &chip->mmchip);
        if (ret)
@@ -180,7 +179,7 @@ static int __devinit mpc52xx_wkup_gpiochip_probe(struct of_device *ofdev,
        return 0;
 }
 
-static int mpc52xx_gpiochip_remove(struct of_device *ofdev)
+static int mpc52xx_gpiochip_remove(struct platform_device *ofdev)
 {
        return -EBUSY;
 }
@@ -311,11 +310,11 @@ mpc52xx_simple_gpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)
        return 0;
 }
 
-static int __devinit mpc52xx_simple_gpiochip_probe(struct of_device *ofdev,
+static int __devinit mpc52xx_simple_gpiochip_probe(struct platform_device *ofdev,
                                        const struct of_device_id *match)
 {
        struct mpc52xx_gpiochip *chip;
-       struct of_gpio_chip *ofchip;
+       struct gpio_chip *gc;
        struct mpc52xx_gpio __iomem *regs;
        int ret;
 
@@ -323,14 +322,13 @@ static int __devinit mpc52xx_simple_gpiochip_probe(struct of_device *ofdev,
        if (!chip)
                return -ENOMEM;
 
-       ofchip = &chip->mmchip.of_gc;
+       gc = &chip->mmchip.gc;
 
-       ofchip->gpio_cells          = 2;
-       ofchip->gc.ngpio            = 32;
-       ofchip->gc.direction_input  = mpc52xx_simple_gpio_dir_in;
-       ofchip->gc.direction_output = mpc52xx_simple_gpio_dir_out;
-       ofchip->gc.get              = mpc52xx_simple_gpio_get;
-       ofchip->gc.set              = mpc52xx_simple_gpio_set;
+       gc->ngpio            = 32;
+       gc->direction_input  = mpc52xx_simple_gpio_dir_in;
+       gc->direction_output = mpc52xx_simple_gpio_dir_out;
+       gc->get              = mpc52xx_simple_gpio_get;
+       gc->set              = mpc52xx_simple_gpio_set;
 
        ret = of_mm_gpiochip_add(ofdev->dev.of_node, &chip->mmchip);
        if (ret)
index 46c93578cbf048230dc24fcd906a113872eb3bfb..fea833e18ad58ab92c78da66e35e2f23dcacd8ff 100644 (file)
@@ -78,7 +78,7 @@ MODULE_LICENSE("GPL");
  * @dev: pointer to device structure
  * @regs: virtual address of GPT registers
  * @lock: spinlock to coordinate between different functions.
- * @of_gc: of_gpio_chip instance structure; used when GPIO is enabled
+ * @gc: gpio_chip instance structure; used when GPIO is enabled
  * @irqhost: Pointer to irq_host instance; used when IRQ mode is supported
  * @wdt_mode: only relevant for gpt0: bit 0 (MPC52xx_GPT_CAN_WDT) indicates
  *   if the gpt may be used as wdt, bit 1 (MPC52xx_GPT_IS_WDT) indicates
@@ -94,7 +94,7 @@ struct mpc52xx_gpt_priv {
        u8 wdt_mode;
 
 #if defined(CONFIG_GPIOLIB)
-       struct of_gpio_chip of_gc;
+       struct gpio_chip gc;
 #endif
 };
 
@@ -280,7 +280,7 @@ mpc52xx_gpt_irq_setup(struct mpc52xx_gpt_priv *gpt, struct device_node *node)
 #if defined(CONFIG_GPIOLIB)
 static inline struct mpc52xx_gpt_priv *gc_to_mpc52xx_gpt(struct gpio_chip *gc)
 {
-       return container_of(to_of_gpio_chip(gc), struct mpc52xx_gpt_priv,of_gc);
+       return container_of(gc, struct mpc52xx_gpt_priv, gc);
 }
 
 static int mpc52xx_gpt_gpio_get(struct gpio_chip *gc, unsigned int gpio)
@@ -336,28 +336,25 @@ mpc52xx_gpt_gpio_setup(struct mpc52xx_gpt_priv *gpt, struct device_node *node)
        if (!of_find_property(node, "gpio-controller", NULL))
                return;
 
-       gpt->of_gc.gc.label = kstrdup(node->full_name, GFP_KERNEL);
-       if (!gpt->of_gc.gc.label) {
+       gpt->gc.label = kstrdup(node->full_name, GFP_KERNEL);
+       if (!gpt->gc.label) {
                dev_err(gpt->dev, "out of memory\n");
                return;
        }
 
-       gpt->of_gc.gpio_cells = 2;
-       gpt->of_gc.gc.ngpio = 1;
-       gpt->of_gc.gc.direction_input  = mpc52xx_gpt_gpio_dir_in;
-       gpt->of_gc.gc.direction_output = mpc52xx_gpt_gpio_dir_out;
-       gpt->of_gc.gc.get = mpc52xx_gpt_gpio_get;
-       gpt->of_gc.gc.set = mpc52xx_gpt_gpio_set;
-       gpt->of_gc.gc.base = -1;
-       gpt->of_gc.xlate = of_gpio_simple_xlate;
-       node->data = &gpt->of_gc;
-       of_node_get(node);
+       gpt->gc.ngpio = 1;
+       gpt->gc.direction_input  = mpc52xx_gpt_gpio_dir_in;
+       gpt->gc.direction_output = mpc52xx_gpt_gpio_dir_out;
+       gpt->gc.get = mpc52xx_gpt_gpio_get;
+       gpt->gc.set = mpc52xx_gpt_gpio_set;
+       gpt->gc.base = -1;
+       gpt->gc.of_node = node;
 
        /* Setup external pin in GPIO mode */
        clrsetbits_be32(&gpt->regs->mode, MPC52xx_GPT_MODE_MS_MASK,
                        MPC52xx_GPT_MODE_MS_GPIO);
 
-       rc = gpiochip_add(&gpt->of_gc.gc);
+       rc = gpiochip_add(&gpt->gc);
        if (rc)
                dev_err(gpt->dev, "gpiochip_add() failed; rc=%i\n", rc);
 
@@ -723,7 +720,7 @@ static inline int mpc52xx_gpt_wdt_setup(struct mpc52xx_gpt_priv *gpt,
 /* ---------------------------------------------------------------------
  * of_platform bus binding code
  */
-static int __devinit mpc52xx_gpt_probe(struct of_device *ofdev,
+static int __devinit mpc52xx_gpt_probe(struct platform_device *ofdev,
                                       const struct of_device_id *match)
 {
        struct mpc52xx_gpt_priv *gpt;
@@ -769,7 +766,7 @@ static int __devinit mpc52xx_gpt_probe(struct of_device *ofdev,
        return 0;
 }
 
-static int mpc52xx_gpt_remove(struct of_device *ofdev)
+static int mpc52xx_gpt_remove(struct platform_device *ofdev)
 {
        return -EBUSY;
 }
index e86aec644501b26ff767379dfdc30a07df745e28..f4ac213c89c0b4fa190e7731813d3be40e44b9a3 100644 (file)
@@ -436,8 +436,8 @@ void mpc52xx_lpbfifo_abort(struct mpc52xx_lpbfifo_request *req)
 }
 EXPORT_SYMBOL(mpc52xx_lpbfifo_abort);
 
-static int __devinit
-mpc52xx_lpbfifo_probe(struct of_device *op, const struct of_device_id *match)
+static int __devinit mpc52xx_lpbfifo_probe(struct platform_device *op,
+                                          const struct of_device_id *match)
 {
        struct resource res;
        int rc = -ENOMEM;
@@ -507,7 +507,7 @@ mpc52xx_lpbfifo_probe(struct of_device *op, const struct of_device_id *match)
 }
 
 
-static int __devexit mpc52xx_lpbfifo_remove(struct of_device *op)
+static int __devexit mpc52xx_lpbfifo_remove(struct platform_device *op)
 {
        if (lpbfifo.dev != &op->dev)
                return 0;
index 9f2e52b36f91673c4787c650bb1fe8b31ae3a09f..1565e0446dc822b2e3036e86077a0311f93d2cb3 100644 (file)
@@ -111,7 +111,7 @@ static struct mdiobb_ctrl ep8248e_mdio_ctrl = {
        .ops = &ep8248e_mdio_ops,
 };
 
-static int __devinit ep8248e_mdio_probe(struct of_device *ofdev,
+static int __devinit ep8248e_mdio_probe(struct platform_device *ofdev,
                                         const struct of_device_id *match)
 {
        struct mii_bus *bus;
@@ -154,7 +154,7 @@ err_free_bus:
        return ret;
 }
 
-static int ep8248e_mdio_remove(struct of_device *ofdev)
+static int ep8248e_mdio_remove(struct platform_device *ofdev)
 {
        BUG();
        return 0;
index d119a7c1c17a970385aa43d975f45f59437053fc..70798ac911ef056b73eba4fccce9db0c157b37e8 100644 (file)
@@ -35,9 +35,8 @@
 
 struct mcu {
        struct mutex lock;
-       struct device_node *np;
        struct i2c_client *client;
-       struct of_gpio_chip of_gc;
+       struct gpio_chip gc;
        u8 reg_ctrl;
 };
 
@@ -56,8 +55,7 @@ static void mcu_power_off(void)
 
 static void mcu_gpio_set(struct gpio_chip *gc, unsigned int gpio, int val)
 {
-       struct of_gpio_chip *of_gc = to_of_gpio_chip(gc);
-       struct mcu *mcu = container_of(of_gc, struct mcu, of_gc);
+       struct mcu *mcu = container_of(gc, struct mcu, gc);
        u8 bit = 1 << (4 + gpio);
 
        mutex_lock(&mcu->lock);
@@ -79,9 +77,7 @@ static int mcu_gpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)
 static int mcu_gpiochip_add(struct mcu *mcu)
 {
        struct device_node *np;
-       struct of_gpio_chip *of_gc = &mcu->of_gc;
-       struct gpio_chip *gc = &of_gc->gc;
-       int ret;
+       struct gpio_chip *gc = &mcu->gc;
 
        np = of_find_compatible_node(NULL, NULL, "fsl,mcu-mpc8349emitx");
        if (!np)
@@ -94,32 +90,14 @@ static int mcu_gpiochip_add(struct mcu *mcu)
        gc->base = -1;
        gc->set = mcu_gpio_set;
        gc->direction_output = mcu_gpio_dir_out;
-       of_gc->gpio_cells = 2;
-       of_gc->xlate = of_gpio_simple_xlate;
+       gc->of_node = np;
 
-       np->data = of_gc;
-       mcu->np = np;
-
-       /*
-        * We don't want to lose the node, its ->data and ->full_name...
-        * So, if succeeded, we don't put the node here.
-        */
-       ret = gpiochip_add(gc);
-       if (ret)
-               of_node_put(np);
-       return ret;
+       return gpiochip_add(gc);
 }
 
 static int mcu_gpiochip_remove(struct mcu *mcu)
 {
-       int ret;
-
-       ret = gpiochip_remove(&mcu->of_gc.gc);
-       if (ret)
-               return ret;
-       of_node_put(mcu->np);
-
-       return 0;
+       return gpiochip_remove(&mcu->gc);
 }
 
 static int __devinit mcu_probe(struct i2c_client *client,
@@ -182,10 +160,16 @@ static const struct i2c_device_id mcu_ids[] = {
 };
 MODULE_DEVICE_TABLE(i2c, mcu_ids);
 
+static struct of_device_id mcu_of_match_table[] __devinitdata = {
+       { .compatible = "fsl,mcu-mpc8349emitx", },
+       { },
+};
+
 static struct i2c_driver mcu_driver = {
        .driver = {
                .name = "mcu-mpc8349emitx",
                .owner = THIS_MODULE,
+               .of_match_table = mcu_of_match_table,
        },
        .probe = mcu_probe,
        .remove = __devexit_p(mcu_remove),
index ebe6c353720972f992936da851bff121b651e9f2..75ae77f1af6a772e586a34d277bd9b5626ecac67 100644 (file)
@@ -99,7 +99,7 @@ struct pmc_type {
        int has_deep_sleep;
 };
 
-static struct of_device *pmc_dev;
+static struct platform_device *pmc_dev;
 static int has_deep_sleep, deep_sleeping;
 static int pmc_irq;
 static struct mpc83xx_pmc __iomem *pmc_regs;
@@ -318,7 +318,7 @@ static struct platform_suspend_ops mpc83xx_suspend_ops = {
        .end = mpc83xx_suspend_end,
 };
 
-static int pmc_probe(struct of_device *ofdev,
+static int pmc_probe(struct platform_device *ofdev,
                      const struct of_device_id *match)
 {
        struct device_node *np = ofdev->dev.of_node;
@@ -396,7 +396,7 @@ out:
        return ret;
 }
 
-static int pmc_remove(struct of_device *ofdev)
+static int pmc_remove(struct platform_device *ofdev)
 {
        return -EPERM;
 };
index b8cb08dbd89c62b435b13a2fa69a2819a974d130..4ff7b1e7bbada2917bfd89e2950ac0c178f6a554 100644 (file)
@@ -118,12 +118,12 @@ static int __init gef_gpio_init(void)
                }
 
                /* Setup pointers to chip functions */
-               gef_gpio_chip->of_gc.gpio_cells = 2;
-               gef_gpio_chip->of_gc.gc.ngpio = 19;
-               gef_gpio_chip->of_gc.gc.direction_input = gef_gpio_dir_in;
-               gef_gpio_chip->of_gc.gc.direction_output = gef_gpio_dir_out;
-               gef_gpio_chip->of_gc.gc.get = gef_gpio_get;
-               gef_gpio_chip->of_gc.gc.set = gef_gpio_set;
+               gef_gpio_chip->gc.of_gpio_n_cells = 2;
+               gef_gpio_chip->gc.ngpio = 19;
+               gef_gpio_chip->gc.direction_input = gef_gpio_dir_in;
+               gef_gpio_chip->gc.direction_output = gef_gpio_dir_out;
+               gef_gpio_chip->gc.get = gef_gpio_get;
+               gef_gpio_chip->gc.set = gef_gpio_set;
 
                /* This function adds a memory mapped GPIO chip */
                retval = of_mm_gpiochip_add(np, gef_gpio_chip);
@@ -146,12 +146,12 @@ static int __init gef_gpio_init(void)
                }
 
                /* Setup pointers to chip functions */
-               gef_gpio_chip->of_gc.gpio_cells = 2;
-               gef_gpio_chip->of_gc.gc.ngpio = 6;
-               gef_gpio_chip->of_gc.gc.direction_input = gef_gpio_dir_in;
-               gef_gpio_chip->of_gc.gc.direction_output = gef_gpio_dir_out;
-               gef_gpio_chip->of_gc.gc.get = gef_gpio_get;
-               gef_gpio_chip->of_gc.gc.set = gef_gpio_set;
+               gef_gpio_chip->gc.of_gpio_n_cells = 2;
+               gef_gpio_chip->gc.ngpio = 6;
+               gef_gpio_chip->gc.direction_input = gef_gpio_dir_in;
+               gef_gpio_chip->gc.direction_output = gef_gpio_dir_out;
+               gef_gpio_chip->gc.get = gef_gpio_get;
+               gef_gpio_chip->gc.set = gef_gpio_set;
 
                /* This function adds a memory mapped GPIO chip */
                retval = of_mm_gpiochip_add(np, gef_gpio_chip);
index fb4eb0df054c0a701fe74df78990d40bd480e2df..03aabc0e16ac2f212ec6d5ae6a78909333e606c6 100644 (file)
  */
 
 #include <linux/kernel.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
 #include <linux/seq_file.h>
 #include <generated/utsrelease.h>
 
 #include <asm/machdep.h>
 #include <asm/cputable.h>
-#include <asm/prom.h>
 #include <asm/pci-bridge.h>
 #include <asm/i8259.h>
 #include <asm/time.h>
index 6257e5378615eeab7c687d7375490a48169c8cc6..97085530aa63b291c677dfbeb5e198b1859a0daf 100644 (file)
@@ -328,7 +328,7 @@ static struct irq_host_ops msic_host_ops = {
        .map    = msic_host_map,
 };
 
-static int axon_msi_shutdown(struct of_device *device)
+static int axon_msi_shutdown(struct platform_device *device)
 {
        struct axon_msic *msic = dev_get_drvdata(&device->dev);
        u32 tmp;
@@ -342,7 +342,7 @@ static int axon_msi_shutdown(struct of_device *device)
        return 0;
 }
 
-static int axon_msi_probe(struct of_device *device,
+static int axon_msi_probe(struct platform_device *device,
                          const struct of_device_id *device_id)
 {
        struct device_node *dn = device->dev.of_node;
index 39d361c5c6d2e73d4ca9f37d1c415b871ca30610..beec405eb6f8d47142959427e6ef97f9f08bc88c 100644 (file)
@@ -108,7 +108,7 @@ static int __init celleb_init_iommu(void)
        celleb_init_direct_mapping();
        set_pci_dma_ops(&dma_direct_ops);
        ppc_md.pci_dma_dev_setup = celleb_pci_dma_dev_setup;
-       bus_register_notifier(&of_platform_bus_type, &celleb_of_bus_notifier);
+       bus_register_notifier(&platform_bus_type, &celleb_of_bus_notifier);
 
        return 0;
 }
index 3712900471ba2e9033419ab31d620ab8d2a983b2..58b13ce3847ec3c92453ef70d5ec4e653d6d886a 100644 (file)
@@ -1204,7 +1204,7 @@ static int __init cell_iommu_init(void)
        /* Register callbacks on OF platform device addition/removal
         * to handle linking them to the right DMA operations
         */
-       bus_register_notifier(&of_platform_bus_type, &cell_of_bus_notifier);
+       bus_register_notifier(&platform_bus_type, &cell_of_bus_notifier);
 
        return 0;
 }
index c5ce02e84c8e421ae032fad6ad4ca569f03c8f6a..1b5749042756cc9e238431b5cb05bc69b5a5dde2 100644 (file)
@@ -61,12 +61,24 @@ static void qpace_progress(char *s, unsigned short hex)
        printk("*** %04x : %s\n", hex, s ? s : "");
 }
 
+static const struct of_device_id qpace_bus_ids[] __initdata = {
+       { .type = "soc", },
+       { .compatible = "soc", },
+       { .type = "spider", },
+       { .type = "axon", },
+       { .type = "plb5", },
+       { .type = "plb4", },
+       { .type = "opb", },
+       { .type = "ebc", },
+       {},
+};
+
 static int __init qpace_publish_devices(void)
 {
        int node;
 
        /* Publish OF platform devices for southbridge IOs */
-       of_platform_bus_probe(NULL, NULL, NULL);
+       of_platform_bus_probe(NULL, qpace_bus_ids, NULL);
 
        /* There is no device for the MIC memory controller, thus we create
         * a platform device for it to attach the EDAC driver to.
index 50385db586bd951c706f0820d352114abb8adea5..691995761b3d46cae9142eb5f27f66c1b60bd6a2 100644 (file)
@@ -141,6 +141,18 @@ static int __devinit cell_setup_phb(struct pci_controller *phb)
        return 0;
 }
 
+static const struct of_device_id cell_bus_ids[] __initdata = {
+       { .type = "soc", },
+       { .compatible = "soc", },
+       { .type = "spider", },
+       { .type = "axon", },
+       { .type = "plb5", },
+       { .type = "plb4", },
+       { .type = "opb", },
+       { .type = "ebc", },
+       {},
+};
+
 static int __init cell_publish_devices(void)
 {
        struct device_node *root = of_find_node_by_path("/");
@@ -148,7 +160,7 @@ static int __init cell_publish_devices(void)
        int node;
 
        /* Publish OF platform devices for southbridge IOs */
-       of_platform_bus_probe(NULL, NULL, NULL);
+       of_platform_bus_probe(NULL, cell_bus_ids, NULL);
 
        /* On spider based blades, we need to manually create the OF
         * platform devices for the PCI host bridges
index d2c1d497846e75f46f612d9c85043a56cadcbaa9..33e5fc7334fc508be63b52ce6cae473f24726a6c 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/init.h>
 #include <linux/completion.h>
 #include <linux/delay.h>
+#include <linux/proc_fs.h>
 #include <linux/dma-mapping.h>
 #include <linux/bcd.h>
 #include <linux/rtc.h>
index 627ee089e75d4bde3b04b3d9ab1ee48d54c931d0..a5d907b5a4c2f0911bd5e3fe7d76dfaf139d9062 100644 (file)
@@ -216,7 +216,7 @@ static int gpio_mdio_reset(struct mii_bus *bus)
 }
 
 
-static int __devinit gpio_mdio_probe(struct of_device *ofdev,
+static int __devinit gpio_mdio_probe(struct platform_device *ofdev,
                                     const struct of_device_id *match)
 {
        struct device *dev = &ofdev->dev;
@@ -275,7 +275,7 @@ out:
 }
 
 
-static int gpio_mdio_remove(struct of_device *dev)
+static int gpio_mdio_remove(struct platform_device *dev)
 {
        struct mii_bus *bus = dev_get_drvdata(&dev->dev);
 
index 79bd3e89dbafd3ce88a31e8516bac96bf23dc87c..39df6ab1735a6161ff4d2581368d5127f6a8297a 100644 (file)
@@ -21,6 +21,8 @@
 #include <linux/delay.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
 #include <linux/spinlock.h>
 #include <linux/adb.h>
 #include <linux/pmu.h>
index 630a533d0e5938a9ad28beb064587a3223a060c0..890d5f72b1988d4511a0aa7fc78db8614521ba17 100644 (file)
@@ -46,6 +46,10 @@ struct pmac_irq_hw {
         unsigned int    level;
 };
 
+/* Workaround flags for 32bit powermac machines */
+unsigned int of_irq_workarounds;
+struct device_node *of_irq_dflt_pic;
+
 /* Default addresses */
 static volatile struct pmac_irq_hw __iomem *pmac_irq_hw[4];
 
@@ -428,6 +432,42 @@ static void __init pmac_pic_probe_oldstyle(void)
        setup_irq(irq_create_mapping(NULL, 20), &xmon_action);
 #endif
 }
+
+int of_irq_map_oldworld(struct device_node *device, int index,
+                       struct of_irq *out_irq)
+{
+       const u32 *ints = NULL;
+       int intlen;
+
+       /*
+        * Old machines just have a list of interrupt numbers
+        * and no interrupt-controller nodes. We also have dodgy
+        * cases where the APPL,interrupts property is completely
+        * missing behind pci-pci bridges and we have to get it
+        * from the parent (the bridge itself, as apple just wired
+        * everything together on these)
+        */
+       while (device) {
+               ints = of_get_property(device, "AAPL,interrupts", &intlen);
+               if (ints != NULL)
+                       break;
+               device = device->parent;
+               if (device && strcmp(device->type, "pci") != 0)
+                       break;
+       }
+       if (ints == NULL)
+               return -EINVAL;
+       intlen /= sizeof(u32);
+
+       if (index >= intlen)
+               return -EINVAL;
+
+       out_irq->controller = NULL;
+       out_irq->specifier[0] = ints[index];
+       out_irq->size = 1;
+
+       return 0;
+}
 #endif /* CONFIG_PPC32 */
 
 static void pmac_u3_cascade(unsigned int irq, struct irq_desc *desc)
@@ -559,19 +599,39 @@ static int __init pmac_pic_probe_mpic(void)
 
 void __init pmac_pic_init(void)
 {
-       unsigned int flags = 0;
-
        /* We configure the OF parsing based on our oldworld vs. newworld
         * platform type and wether we were booted by BootX.
         */
 #ifdef CONFIG_PPC32
        if (!pmac_newworld)
-               flags |= OF_IMAP_OLDWORLD_MAC;
+               of_irq_workarounds |= OF_IMAP_OLDWORLD_MAC;
        if (of_get_property(of_chosen, "linux,bootx", NULL) != NULL)
-               flags |= OF_IMAP_NO_PHANDLE;
-#endif /* CONFIG_PPC_32 */
+               of_irq_workarounds |= OF_IMAP_NO_PHANDLE;
 
-       of_irq_map_init(flags);
+       /* If we don't have phandles on a newworld, then try to locate a
+        * default interrupt controller (happens when booting with BootX).
+        * We do a first match here, hopefully, that only ever happens on
+        * machines with one controller.
+        */
+       if (pmac_newworld && (of_irq_workarounds & OF_IMAP_NO_PHANDLE)) {
+               struct device_node *np;
+
+               for_each_node_with_property(np, "interrupt-controller") {
+                       /* Skip /chosen/interrupt-controller */
+                       if (strcmp(np->name, "chosen") == 0)
+                               continue;
+                       /* It seems like at least one person wants
+                        * to use BootX on a machine with an AppleKiwi
+                        * controller which happens to pretend to be an
+                        * interrupt controller too. */
+                       if (strcmp(np->name, "AppleKiwi") == 0)
+                               continue;
+                       /* I think we found one ! */
+                       of_irq_dflt_pic = np;
+                       break;
+               }
+       }
+#endif /* CONFIG_PPC32 */
 
        /* We first try to detect Apple's new Core99 chipset, since mac-io
         * is quite different on those machines and contains an IBM MPIC2.
index 402d2212162f6bddc0a79506112448d6f6714461..2659a60bd7b864503ae2ab39b83fd991f5d90357 100644 (file)
@@ -60,7 +60,7 @@
 static int azfs_major, azfs_minor;
 
 struct axon_ram_bank {
-       struct of_device        *device;
+       struct platform_device  *device;
        struct gendisk          *disk;
        unsigned int            irq_id;
        unsigned long           ph_addr;
@@ -72,7 +72,7 @@ struct axon_ram_bank {
 static ssize_t
 axon_ram_sysfs_ecc(struct device *dev, struct device_attribute *attr, char *buf)
 {
-       struct of_device *device = to_of_device(dev);
+       struct platform_device *device = to_platform_device(dev);
        struct axon_ram_bank *bank = device->dev.platform_data;
 
        BUG_ON(!bank);
@@ -90,7 +90,7 @@ static DEVICE_ATTR(ecc, S_IRUGO, axon_ram_sysfs_ecc, NULL);
 static irqreturn_t
 axon_ram_irq_handler(int irq, void *dev)
 {
-       struct of_device *device = dev;
+       struct platform_device *device = dev;
        struct axon_ram_bank *bank = device->dev.platform_data;
 
        BUG_ON(!bank);
@@ -174,8 +174,8 @@ static const struct block_device_operations axon_ram_devops = {
  * axon_ram_probe - probe() method for platform driver
  * @device, @device_id: see of_platform_driver method
  */
-static int
-axon_ram_probe(struct of_device *device, const struct of_device_id *device_id)
+static int axon_ram_probe(struct platform_device *device,
+                         const struct of_device_id *device_id)
 {
        static int axon_ram_bank_id = -1;
        struct axon_ram_bank *bank;
@@ -304,7 +304,7 @@ failed:
  * @device: see of_platform_driver method
  */
 static int
-axon_ram_remove(struct of_device *device)
+axon_ram_remove(struct platform_device *device)
 {
        struct axon_ram_bank *bank = device->dev.platform_data;
 
index a7c5c470af147f73edb4a7448879b20fabf522cc..65025611506495447386e214112f3bf03e166599 100644 (file)
@@ -365,8 +365,8 @@ bcom_engine_cleanup(void)
 /* OF platform driver                                                       */
 /* ======================================================================== */
 
-static int __devinit
-mpc52xx_bcom_probe(struct of_device *op, const struct of_device_id *match)
+static int __devinit mpc52xx_bcom_probe(struct platform_device *op,
+                                       const struct of_device_id *match)
 {
        struct device_node *ofn_sram;
        struct resource res_bcom;
@@ -461,8 +461,7 @@ error_ofput:
 }
 
 
-static int
-mpc52xx_bcom_remove(struct of_device *op)
+static int mpc52xx_bcom_remove(struct platform_device *op)
 {
        /* Clean up the engine */
        bcom_engine_cleanup();
index 5d74ef7a651f6e6f4fb38837fe914bcbe4c0297c..1225012a681a01de66f5b80bdaf117451f2052d2 100644 (file)
@@ -11,6 +11,7 @@
  * kind, whether express or implied.
  */
 
+#include <linux/err.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/slab.h>
index 8d103ca6d6ab8821273519c04a65599785c31351..00852124ff4a4844a846ea847bd14e4f978f3533 100644 (file)
@@ -621,7 +621,6 @@ int cpm1_gpiochip_add16(struct device_node *np)
 {
        struct cpm1_gpio16_chip *cpm1_gc;
        struct of_mm_gpio_chip *mm_gc;
-       struct of_gpio_chip *of_gc;
        struct gpio_chip *gc;
 
        cpm1_gc = kzalloc(sizeof(*cpm1_gc), GFP_KERNEL);
@@ -631,11 +630,9 @@ int cpm1_gpiochip_add16(struct device_node *np)
        spin_lock_init(&cpm1_gc->lock);
 
        mm_gc = &cpm1_gc->mm_gc;
-       of_gc = &mm_gc->of_gc;
-       gc = &of_gc->gc;
+       gc = &mm_gc->gc;
 
        mm_gc->save_regs = cpm1_gpio16_save_regs;
-       of_gc->gpio_cells = 2;
        gc->ngpio = 16;
        gc->direction_input = cpm1_gpio16_dir_in;
        gc->direction_output = cpm1_gpio16_dir_out;
@@ -745,7 +742,6 @@ int cpm1_gpiochip_add32(struct device_node *np)
 {
        struct cpm1_gpio32_chip *cpm1_gc;
        struct of_mm_gpio_chip *mm_gc;
-       struct of_gpio_chip *of_gc;
        struct gpio_chip *gc;
 
        cpm1_gc = kzalloc(sizeof(*cpm1_gc), GFP_KERNEL);
@@ -755,11 +751,9 @@ int cpm1_gpiochip_add32(struct device_node *np)
        spin_lock_init(&cpm1_gc->lock);
 
        mm_gc = &cpm1_gc->mm_gc;
-       of_gc = &mm_gc->of_gc;
-       gc = &of_gc->gc;
+       gc = &mm_gc->gc;
 
        mm_gc->save_regs = cpm1_gpio32_save_regs;
-       of_gc->gpio_cells = 2;
        gc->ngpio = 32;
        gc->direction_input = cpm1_gpio32_dir_in;
        gc->direction_output = cpm1_gpio32_dir_out;
index 88b9812c854fdc2de978871012eeb3c507717569..2b69aa0315b3c5ec1ea9d87081209639d237aa6a 100644 (file)
@@ -325,7 +325,6 @@ int cpm2_gpiochip_add32(struct device_node *np)
 {
        struct cpm2_gpio32_chip *cpm2_gc;
        struct of_mm_gpio_chip *mm_gc;
-       struct of_gpio_chip *of_gc;
        struct gpio_chip *gc;
 
        cpm2_gc = kzalloc(sizeof(*cpm2_gc), GFP_KERNEL);
@@ -335,11 +334,9 @@ int cpm2_gpiochip_add32(struct device_node *np)
        spin_lock_init(&cpm2_gc->lock);
 
        mm_gc = &cpm2_gc->mm_gc;
-       of_gc = &mm_gc->of_gc;
-       gc = &of_gc->gc;
+       gc = &mm_gc->gc;
 
        mm_gc->save_regs = cpm2_gpio32_save_regs;
-       of_gc->gpio_cells = 2;
        gc->ngpio = 32;
        gc->direction_input = cpm2_gpio32_dir_in;
        gc->direction_output = cpm2_gpio32_dir_out;
index eca4545dd52ee0619b0bb0ad2b86597a5737d736..7dd2885321ad112cf88592e299d77ac4b2359d9b 100644 (file)
@@ -14,6 +14,7 @@
  */
 
 #include <linux/kernel.h>
+#include <linux/err.h>
 #include <linux/errno.h>
 #include <linux/list.h>
 #include <linux/io.h>
index 962c2d8dd8d927e0d2e03336dff954e42935ef86..87991d3abbab1c2e90268386be666764112cab38 100644 (file)
@@ -250,7 +250,7 @@ unlock:
        raw_spin_unlock(&desc->lock);
 }
 
-static int fsl_of_msi_remove(struct of_device *ofdev)
+static int fsl_of_msi_remove(struct platform_device *ofdev)
 {
        struct fsl_msi *msi = ofdev->dev.platform_data;
        int virq, i;
@@ -274,7 +274,7 @@ static int fsl_of_msi_remove(struct of_device *ofdev)
        return 0;
 }
 
-static int __devinit fsl_of_msi_probe(struct of_device *dev,
+static int __devinit fsl_of_msi_probe(struct platform_device *dev,
                                const struct of_device_id *match)
 {
        struct fsl_msi *msi;
index 9082eb921ad995f7caac8752d00f9dc91cf48381..44de8559c9759ff65cfd1bca3e4f14088ebff038 100644 (file)
@@ -58,7 +58,8 @@ static struct platform_suspend_ops pmc_suspend_ops = {
        .enter = pmc_suspend_enter,
 };
 
-static int pmc_probe(struct of_device *ofdev, const struct of_device_id *id)
+static int pmc_probe(struct platform_device *ofdev,
+                    const struct of_device_id *id)
 {
        pmc_regs = of_iomap(ofdev->dev.of_node, 0);
        if (!pmc_regs)
index 30e1626b2e850c9f2d5f9d2137f3025cf05f4ea8..8bd86530ee252cfafa19d3c5866853385398104a 100644 (file)
@@ -1338,7 +1338,7 @@ static inline void fsl_rio_info(struct device *dev, u32 ccsr)
  * master port with system-specific info, and registers the
  * master port with the RapidIO subsystem.
  */
-int fsl_rio_setup(struct of_device *dev)
+int fsl_rio_setup(struct platform_device *dev)
 {
        struct rio_ops *ops;
        struct rio_mport *port;
@@ -1536,7 +1536,7 @@ err_ops:
 
 /* The probe function for RapidIO peer-to-peer network.
  */
-static int __devinit fsl_of_rio_rpn_probe(struct of_device *dev,
+static int __devinit fsl_of_rio_rpn_probe(struct platform_device *dev,
                                     const struct of_device_id *match)
 {
        int rc;
index 83f519655fac0cd00286f3f121f9cd646f19fff2..2b69084d0f0cb7f9cc0acdb4a0d4d1c024bb1a69 100644 (file)
@@ -257,7 +257,6 @@ static void __init mpc8xxx_add_controller(struct device_node *np)
 {
        struct mpc8xxx_gpio_chip *mpc8xxx_gc;
        struct of_mm_gpio_chip *mm_gc;
-       struct of_gpio_chip *of_gc;
        struct gpio_chip *gc;
        unsigned hwirq;
        int ret;
@@ -271,11 +270,9 @@ static void __init mpc8xxx_add_controller(struct device_node *np)
        spin_lock_init(&mpc8xxx_gc->lock);
 
        mm_gc = &mpc8xxx_gc->mm_gc;
-       of_gc = &mm_gc->of_gc;
-       gc = &of_gc->gc;
+       gc = &mm_gc->gc;
 
        mm_gc->save_regs = mpc8xxx_gpio_save_regs;
-       of_gc->gpio_cells = 2;
        gc->ngpio = MPC8XXX_GPIO_PINS;
        gc->direction_input = mpc8xxx_gpio_dir_in;
        gc->direction_output = mpc8xxx_gpio_dir_out;
index 31acd3b1718b8f09be498fd2a15d82aa72464ca5..1398bc454999b2b10fae54972e5e92c69689b3eb 100644 (file)
 
 #include <asm/prom.h>
 
-/*
- * These functions provide the necessary setup for the mv64x60 drivers.
- * These drivers are unusual in that they work on both the MIPS and PowerPC
- * architectures.  Because of that, the drivers do not support the normal
- * PowerPC of_platform_bus_type.  They support platform_bus_type instead.
- */
+/* These functions provide the necessary setup for the mv64x60 drivers. */
 
 static struct of_device_id __initdata of_mv64x60_devices[] = {
        { .compatible = "marvell,mv64306-devctrl", },
index d07137a07d7509b0e6cf082f5de6e421922f2091..24a0bb955b184bba92c6d0d9efda52ac568bee74 100644 (file)
@@ -43,7 +43,7 @@ struct pmi_data {
        struct mutex            msg_mutex;
        pmi_message_t           msg;
        struct completion       *completion;
-       struct of_device        *dev;
+       struct platform_device  *dev;
        int                     irq;
        u8 __iomem              *pmi_reg;
        struct work_struct      work;
@@ -121,7 +121,7 @@ static void pmi_notify_handlers(struct work_struct *work)
        spin_unlock(&data->handler_spinlock);
 }
 
-static int pmi_of_probe(struct of_device *dev,
+static int pmi_of_probe(struct platform_device *dev,
                        const struct of_device_id *match)
 {
        struct device_node *np = dev->dev.of_node;
@@ -185,7 +185,7 @@ out:
        return rc;
 }
 
-static int pmi_of_remove(struct of_device *dev)
+static int pmi_of_remove(struct platform_device *dev)
 {
        struct pmi_handler *handler, *tmp;
 
index 3812fc366becfcf92af075f9339338d5e3533008..fc65ad1b32931eb8bb60188ccf86b04af30c6ef8 100644 (file)
@@ -181,7 +181,6 @@ static int __init ppc4xx_add_gpiochips(void)
                int ret;
                struct ppc4xx_gpio_chip *ppc4xx_gc;
                struct of_mm_gpio_chip *mm_gc;
-               struct of_gpio_chip *of_gc;
                struct gpio_chip *gc;
 
                ppc4xx_gc = kzalloc(sizeof(*ppc4xx_gc), GFP_KERNEL);
@@ -193,10 +192,8 @@ static int __init ppc4xx_add_gpiochips(void)
                spin_lock_init(&ppc4xx_gc->lock);
 
                mm_gc = &ppc4xx_gc->mm_gc;
-               of_gc = &mm_gc->of_gc;
-               gc = &of_gc->gc;
+               gc = &mm_gc->gc;
 
-               of_gc->gpio_cells = 2;
                gc->ngpio = 32;
                gc->direction_input = ppc4xx_gpio_dir_in;
                gc->direction_output = ppc4xx_gpio_dir_out;
index dc8f8d61807480dc17faea46939dc30caec8ec39..36bf845df12779622d20c76733115488b1b60887 100644 (file)
@@ -138,8 +138,8 @@ struct qe_pin {
 struct qe_pin *qe_pin_request(struct device_node *np, int index)
 {
        struct qe_pin *qe_pin;
-       struct device_node *gc;
-       struct of_gpio_chip *of_gc = NULL;
+       struct device_node *gpio_np;
+       struct gpio_chip *gc;
        struct of_mm_gpio_chip *mm_gc;
        struct qe_gpio_chip *qe_gc;
        int err;
@@ -155,40 +155,40 @@ struct qe_pin *qe_pin_request(struct device_node *np, int index)
        }
 
        err = of_parse_phandles_with_args(np, "gpios", "#gpio-cells", index,
-                                         &gc, &gpio_spec);
+                                         &gpio_np, &gpio_spec);
        if (err) {
                pr_debug("%s: can't parse gpios property\n", __func__);
                goto err0;
        }
 
-       if (!of_device_is_compatible(gc, "fsl,mpc8323-qe-pario-bank")) {
+       if (!of_device_is_compatible(gpio_np, "fsl,mpc8323-qe-pario-bank")) {
                pr_debug("%s: tried to get a non-qe pin\n", __func__);
                err = -EINVAL;
                goto err1;
        }
 
-       of_gc = gc->data;
-       if (!of_gc) {
+       gc = of_node_to_gpiochip(gpio_np);
+       if (!gc) {
                pr_debug("%s: gpio controller %s isn't registered\n",
-                        np->full_name, gc->full_name);
+                        np->full_name, gpio_np->full_name);
                err = -ENODEV;
                goto err1;
        }
 
-       gpio_cells = of_get_property(gc, "#gpio-cells", &size);
+       gpio_cells = of_get_property(gpio_np, "#gpio-cells", &size);
        if (!gpio_cells || size != sizeof(*gpio_cells) ||
-                       *gpio_cells != of_gc->gpio_cells) {
+                       *gpio_cells != gc->of_gpio_n_cells) {
                pr_debug("%s: wrong #gpio-cells for %s\n",
-                        np->full_name, gc->full_name);
+                        np->full_name, gpio_np->full_name);
                err = -EINVAL;
                goto err1;
        }
 
-       err = of_gc->xlate(of_gc, np, gpio_spec, NULL);
+       err = gc->of_xlate(gc, np, gpio_spec, NULL);
        if (err < 0)
                goto err1;
 
-       mm_gc = to_of_mm_gpio_chip(&of_gc->gc);
+       mm_gc = to_of_mm_gpio_chip(gc);
        qe_gc = to_qe_gpio_chip(mm_gc);
 
        spin_lock_irqsave(&qe_gc->lock, flags);
@@ -206,7 +206,7 @@ struct qe_pin *qe_pin_request(struct device_node *np, int index)
        if (!err)
                return qe_pin;
 err1:
-       of_node_put(gc);
+       of_node_put(gpio_np);
 err0:
        kfree(qe_pin);
        pr_debug("%s failed with status %d\n", __func__, err);
@@ -307,7 +307,6 @@ static int __init qe_add_gpiochips(void)
                int ret;
                struct qe_gpio_chip *qe_gc;
                struct of_mm_gpio_chip *mm_gc;
-               struct of_gpio_chip *of_gc;
                struct gpio_chip *gc;
 
                qe_gc = kzalloc(sizeof(*qe_gc), GFP_KERNEL);
@@ -319,11 +318,9 @@ static int __init qe_add_gpiochips(void)
                spin_lock_init(&qe_gc->lock);
 
                mm_gc = &qe_gc->mm_gc;
-               of_gc = &mm_gc->of_gc;
-               gc = &of_gc->gc;
+               gc = &mm_gc->gc;
 
                mm_gc->save_regs = qe_gpio_save_regs;
-               of_gc->gpio_cells = 2;
                gc->ngpio = QE_PIO_PINS;
                gc->direction_input = qe_gpio_dir_in;
                gc->direction_output = qe_gpio_dir_out;
index 093e0ae1a9418fc0830be5c6bee35041c774d198..3da8014931c9c7a99afcebf52814b50d03d02f35 100644 (file)
@@ -651,14 +651,15 @@ unsigned int qe_get_num_of_snums(void)
 EXPORT_SYMBOL(qe_get_num_of_snums);
 
 #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC_85xx)
-static int qe_resume(struct of_device *ofdev)
+static int qe_resume(struct platform_device *ofdev)
 {
        if (!qe_alive_during_sleep())
                qe_reset();
        return 0;
 }
 
-static int qe_probe(struct of_device *ofdev, const struct of_device_id *id)
+static int qe_probe(struct platform_device *ofdev,
+                   const struct of_device_id *id)
 {
        return 0;
 }
index d5fb173e588cbe602fdd202291f01fc72fd47d76..b6defda5ccc90834c732b946cd29334ae3c75249 100644 (file)
@@ -91,7 +91,6 @@ static int __init u8_simple_gpiochip_add(struct device_node *np)
        int ret;
        struct u8_gpio_chip *u8_gc;
        struct of_mm_gpio_chip *mm_gc;
-       struct of_gpio_chip *of_gc;
        struct gpio_chip *gc;
 
        u8_gc = kzalloc(sizeof(*u8_gc), GFP_KERNEL);
@@ -101,11 +100,9 @@ static int __init u8_simple_gpiochip_add(struct device_node *np)
        spin_lock_init(&u8_gc->lock);
 
        mm_gc = &u8_gc->mm_gc;
-       of_gc = &mm_gc->of_gc;
-       gc = &of_gc->gc;
+       gc = &mm_gc->gc;
 
        mm_gc->save_regs = u8_gpio_save_regs;
-       of_gc->gpio_cells = 2;
        gc->ngpio = 8;
        gc->direction_input = u8_gpio_dir_in;
        gc->direction_output = u8_gpio_dir_out;
index c0015db247ba46ed787b4b16b47f402a3de1152a..ba068c833e5d83f4399cb229e687fe553d5e33fc 100644 (file)
@@ -18,6 +18,7 @@ config 64BIT
 config SPARC
        bool
        default y
+       select OF
        select HAVE_IDE
        select HAVE_OPROFILE
        select HAVE_ARCH_KGDB if !SMP || SPARC64
@@ -148,9 +149,6 @@ config GENERIC_GPIO
 config ARCH_NO_VIRT_TO_BUS
        def_bool y
 
-config OF
-       def_bool y
-
 config ARCH_SUPPORTS_DEBUG_PAGEALLOC
        def_bool y if SPARC64
 
index d4c45214741252d7327daf0ba0f50c10dcef6f5f..daa6a8a5e9cd0d5dfa102ca89639d3eda8d53f5c 100644 (file)
@@ -6,18 +6,25 @@
 #ifndef _ASM_SPARC_DEVICE_H
 #define _ASM_SPARC_DEVICE_H
 
+#include <asm/openprom.h>
+
 struct device_node;
-struct of_device;
+struct platform_device;
 
 struct dev_archdata {
        void                    *iommu;
        void                    *stc;
        void                    *host_controller;
-       struct of_device        *op;
+       struct platform_device  *op;
        int                     numa_node;
 };
 
+extern void of_propagate_archdata(struct platform_device *bus);
+
 struct pdev_archdata {
+       struct resource         resource[PROMREG_MAX];
+       unsigned int            irqs[PROMINTR_MAX];
+       int                     num_irqs;
 };
 
 #endif /* _ASM_SPARC_DEVICE_H */
index 8fac3ab22f36f6ebde89a140ce08e4fd5d107099..6597ce874d78761147e7ae206bca34c444c3ad87 100644 (file)
@@ -43,7 +43,7 @@ struct sun_flpy_controller {
 /* You'll only ever find one controller on an Ultra anyways. */
 static struct sun_flpy_controller *sun_fdc = (struct sun_flpy_controller *)-1;
 unsigned long fdc_status;
-static struct of_device *floppy_op = NULL;
+static struct platform_device *floppy_op = NULL;
 
 struct sun_floppy_ops {
        unsigned char   (*fd_inb) (unsigned long port);
@@ -548,7 +548,7 @@ static unsigned long __init sun_floppy_init(void)
 {
        static int initialized = 0;
        struct device_node *dp;
-       struct of_device *op;
+       struct platform_device *op;
        const char *prop;
        char state[128];
 
@@ -567,7 +567,7 @@ static unsigned long __init sun_floppy_init(void)
        }
        if (op) {
                floppy_op = op;
-               FLOPPY_IRQ = op->irqs[0];
+               FLOPPY_IRQ = op->archdata.irqs[0];
        } else {
                struct device_node *ebus_dp;
                void __iomem *auxio_reg;
@@ -593,7 +593,7 @@ static unsigned long __init sun_floppy_init(void)
                if (state_prop && !strncmp(state_prop, "disabled", 8))
                        return 0;
 
-               FLOPPY_IRQ = op->irqs[0];
+               FLOPPY_IRQ = op->archdata.irqs[0];
 
                /* Make sure the high density bit is set, some systems
                 * (most notably Ultra5/Ultra10) come up with it clear.
@@ -661,7 +661,7 @@ static unsigned long __init sun_floppy_init(void)
                config = 0;
                for (dp = ebus_dp->child; dp; dp = dp->sibling) {
                        if (!strcmp(dp->name, "ecpp")) {
-                               struct of_device *ecpp_op;
+                               struct platform_device *ecpp_op;
 
                                ecpp_op = of_find_device_by_node(dp);
                                if (ecpp_op)
diff --git a/arch/sparc/include/asm/of_device.h b/arch/sparc/include/asm/of_device.h
deleted file mode 100644 (file)
index f320246..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef _ASM_SPARC_OF_DEVICE_H
-#define _ASM_SPARC_OF_DEVICE_H
-#ifdef __KERNEL__
-
-#include <linux/device.h>
-#include <linux/of.h>
-#include <linux/mod_devicetable.h>
-#include <asm/openprom.h>
-
-/*
- * The of_device is a kind of "base class" that is a superset of
- * struct device for use by devices attached to an OF node and
- * probed using OF properties.
- */
-struct of_device
-{
-       struct device                   dev;
-       struct resource                 resource[PROMREG_MAX];
-       unsigned int                    irqs[PROMINTR_MAX];
-       int                             num_irqs;
-
-       void                            *sysdata;
-
-       int                             slot;
-       int                             portid;
-       int                             clock_freq;
-};
-
-extern void __iomem *of_ioremap(struct resource *res, unsigned long offset, unsigned long size, char *name);
-extern void of_iounmap(struct resource *res, void __iomem *base, unsigned long size);
-
-extern void of_propagate_archdata(struct of_device *bus);
-
-/* This is just here during the transition */
-#include <linux/of_platform.h>
-
-#endif /* __KERNEL__ */
-#endif /* _ASM_SPARC_OF_DEVICE_H */
diff --git a/arch/sparc/include/asm/of_platform.h b/arch/sparc/include/asm/of_platform.h
deleted file mode 100644 (file)
index 90da990..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef ___ASM_SPARC_OF_PLATFORM_H
-#define ___ASM_SPARC_OF_PLATFORM_H
-/*
- *    Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corp.
- *                      <benh@kernel.crashing.org>
- *    Modified for Sparc by merging parts of asm/of_device.h
- *             by Stephen Rothwell
- *
- *  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.
- *
- */
-
-#define of_bus_type    of_platform_bus_type    /* for compatibility */
-
-#endif
index c333b8d0949bf199b9a88a8b406ff644ca69c74e..4f7afa01b2aeb0e3c15dfac8de1308bdcd5f5b77 100644 (file)
@@ -103,7 +103,7 @@ static inline unsigned int get_dma_residue(unsigned int dmanr)
        return ebus_dma_residue(&sparc_ebus_dmas[dmanr].info);
 }
 
-static int __devinit ecpp_probe(struct of_device *op, const struct of_device_id *match)
+static int __devinit ecpp_probe(struct platform_device *op, const struct of_device_id *match)
 {
        unsigned long base = op->resource[0].start;
        unsigned long config = op->resource[1].start;
@@ -116,7 +116,7 @@ static int __devinit ecpp_probe(struct of_device *op, const struct of_device_id
        parent = op->dev.of_node->parent;
        if (!strcmp(parent->name, "dma")) {
                p = parport_pc_probe_port(base, base + 0x400,
-                                         op->irqs[0], PARPORT_DMA_NOFIFO,
+                                         op->archdata.irqs[0], PARPORT_DMA_NOFIFO,
                                          op->dev.parent->parent, 0);
                if (!p)
                        return -ENOMEM;
@@ -166,7 +166,7 @@ static int __devinit ecpp_probe(struct of_device *op, const struct of_device_id
                       0, PTR_LPT_REG_DIR);
 
        p = parport_pc_probe_port(base, base + 0x400,
-                                 op->irqs[0],
+                                 op->archdata.irqs[0],
                                  slot,
                                  op->dev.parent,
                                  0);
@@ -192,7 +192,7 @@ out_err:
        return err;
 }
 
-static int __devexit ecpp_remove(struct of_device *op)
+static int __devexit ecpp_remove(struct platform_device *op)
 {
        struct parport *p = dev_get_drvdata(&op->dev);
        int slot = p->dma;
@@ -243,9 +243,7 @@ static struct of_platform_driver ecpp_driver = {
 
 static int parport_pc_find_nonpci_ports(int autoirq, int autodma)
 {
-       of_register_driver(&ecpp_driver, &of_bus_type);
-
-       return 0;
+       return of_register_platform_driver(&ecpp_driver);
 }
 
 #endif /* !(_ASM_SPARC64_PARPORT_H */
index f845828ca4c6ab5bf2f5c6e1020e8a0f54984b8a..291f12575eddcd598aca91ce46dbe1c9e08b31e1 100644 (file)
@@ -43,20 +43,22 @@ extern int of_getintprop_default(struct device_node *np,
 extern int of_find_in_proplist(const char *list, const char *match, int len);
 #ifdef CONFIG_NUMA
 extern int of_node_to_nid(struct device_node *dp);
-#else
-#define of_node_to_nid(dp)     (-1)
+#define of_node_to_nid of_node_to_nid
 #endif
 
 extern void prom_build_devicetree(void);
 extern void of_populate_present_mask(void);
 extern void of_fill_in_cpu_data(void);
 
+struct resource;
+extern void __iomem *of_ioremap(struct resource *res, unsigned long offset, unsigned long size, char *name);
+extern void of_iounmap(struct resource *res, void __iomem *base, unsigned long size);
+
 /* These routines are here to provide compatibility with how powerpc
  * handles IRQ mapping for OF device nodes.  We precompute and permanently
- * register them in the of_device objects, whereas powerpc computes them
+ * register them in the platform_device objects, whereas powerpc computes them
  * on request.
  */
-extern unsigned int irq_of_parse_and_map(struct device_node *node, int index);
 static inline void irq_dispose_mapping(unsigned int virq)
 {
 }
index b27476caa1333d4fbc2a85b380c4eb3c392c4c97..2c0046ecc7155592401d56c340c275e2697348a7 100644 (file)
@@ -68,7 +68,7 @@ static void apc_swift_idle(void)
 #endif
 } 
 
-static inline void apc_free(struct of_device *op)
+static inline void apc_free(struct platform_device *op)
 {
        of_iounmap(&op->resource[0], regs, resource_size(&op->resource[0]));
 }
@@ -136,7 +136,7 @@ static const struct file_operations apc_fops = {
 
 static struct miscdevice apc_miscdev = { APC_MINOR, APC_DEVNAME, &apc_fops };
 
-static int __devinit apc_probe(struct of_device *op,
+static int __devinit apc_probe(struct platform_device *op,
                               const struct of_device_id *match)
 {
        int err;
@@ -184,7 +184,7 @@ static struct of_platform_driver apc_driver = {
 
 static int __init apc_init(void)
 {
-       return of_register_driver(&apc_driver, &of_bus_type);
+       return of_register_platform_driver(&apc_driver);
 }
 
 /* This driver is not critical to the boot process
index ddc84128b3c2e4c9be06129f1aecc04f196a3dab..3efd3c5af6a910181c47ba0075d7a95ae036beaf 100644 (file)
@@ -102,7 +102,8 @@ static struct of_device_id __initdata auxio_match[] = {
 
 MODULE_DEVICE_TABLE(of, auxio_match);
 
-static int __devinit auxio_probe(struct of_device *dev, const struct of_device_id *match)
+static int __devinit auxio_probe(struct platform_device *dev,
+                                const struct of_device_id *match)
 {
        struct device_node *dp = dev->dev.of_node;
        unsigned long size;
@@ -142,7 +143,7 @@ static struct of_platform_driver auxio_driver = {
 
 static int __init auxio_init(void)
 {
-       return of_register_driver(&auxio_driver, &of_platform_bus_type);
+       return of_register_platform_driver(&auxio_driver);
 }
 
 /* Must be after subsys_initcall() so that busses are probed.  Must
index 434335f65823ec944626a9cbe0b9bbccb28bfd86..cfa2624c5332ea43f20c9232555b80a3e95fde59 100644 (file)
@@ -59,7 +59,7 @@ static int __devinit clock_board_calc_nslots(struct clock_board *p)
        }
 }
 
-static int __devinit clock_board_probe(struct of_device *op,
+static int __devinit clock_board_probe(struct platform_device *op,
                                       const struct of_device_id *match)
 {
        struct clock_board *p = kzalloc(sizeof(*p), GFP_KERNEL);
@@ -157,7 +157,7 @@ static struct of_platform_driver clock_board_driver = {
        },
 };
 
-static int __devinit fhc_probe(struct of_device *op,
+static int __devinit fhc_probe(struct platform_device *op,
                               const struct of_device_id *match)
 {
        struct fhc *p = kzalloc(sizeof(*p), GFP_KERNEL);
@@ -265,8 +265,8 @@ static struct of_platform_driver fhc_driver = {
 
 static int __init sunfire_init(void)
 {
-       (void) of_register_driver(&fhc_driver, &of_platform_bus_type);
-       (void) of_register_driver(&clock_board_driver, &of_platform_bus_type);
+       (void) of_register_platform_driver(&fhc_driver);
+       (void) of_register_platform_driver(&clock_board_driver);
        return 0;
 }
 
index 870cb65b3f216e38b81fc6932afe145067f6aec9..08c466ebb32b6c677c386f543211e8663ec46ae7 100644 (file)
@@ -392,7 +392,7 @@ static void __devinit jbusmc_construct_dimm_groups(struct jbusmc *p,
        }
 }
 
-static int __devinit jbusmc_probe(struct of_device *op,
+static int __devinit jbusmc_probe(struct platform_device *op,
                                  const struct of_device_id *match)
 {
        const struct linux_prom64_registers *mem_regs;
@@ -690,7 +690,7 @@ static void chmc_fetch_decode_regs(struct chmc *p)
                                      chmc_read_mcreg(p, CHMCTRL_DECODE4));
 }
 
-static int __devinit chmc_probe(struct of_device *op,
+static int __devinit chmc_probe(struct platform_device *op,
                                const struct of_device_id *match)
 {
        struct device_node *dp = op->dev.of_node;
@@ -765,7 +765,7 @@ out_free:
        goto out;
 }
 
-static int __devinit us3mc_probe(struct of_device *op,
+static int __devinit us3mc_probe(struct platform_device *op,
                                const struct of_device_id *match)
 {
        if (mc_type == MC_TYPE_SAFARI)
@@ -775,21 +775,21 @@ static int __devinit us3mc_probe(struct of_device *op,
        return -ENODEV;
 }
 
-static void __devexit chmc_destroy(struct of_device *op, struct chmc *p)
+static void __devexit chmc_destroy(struct platform_device *op, struct chmc *p)
 {
        list_del(&p->list);
        of_iounmap(&op->resource[0], p->regs, 0x48);
        kfree(p);
 }
 
-static void __devexit jbusmc_destroy(struct of_device *op, struct jbusmc *p)
+static void __devexit jbusmc_destroy(struct platform_device *op, struct jbusmc *p)
 {
        mc_list_del(&p->list);
        of_iounmap(&op->resource[0], p->regs, JBUSMC_REGS_SIZE);
        kfree(p);
 }
 
-static int __devexit us3mc_remove(struct of_device *op)
+static int __devexit us3mc_remove(struct platform_device *op)
 {
        void *p = dev_get_drvdata(&op->dev);
 
@@ -848,7 +848,7 @@ static int __init us3mc_init(void)
        ret = register_dimm_printer(us3mc_dimm_printer);
 
        if (!ret) {
-               ret = of_register_driver(&us3mc_driver, &of_bus_type);
+               ret = of_register_platform_driver(&us3mc_driver);
                if (ret)
                        unregister_dimm_printer(us3mc_dimm_printer);
        }
@@ -859,7 +859,7 @@ static void __exit us3mc_cleanup(void)
 {
        if (us3mc_platform()) {
                unregister_dimm_printer(us3mc_dimm_printer);
-               of_unregister_driver(&us3mc_driver);
+               of_unregister_platform_driver(&us3mc_driver);
        }
 }
 
index 703e4aa9bc38420fde79f7a7fdbc6b9bb60045b6..41f7e4e0f72a65a900985c485a816a4721206c89 100644 (file)
@@ -253,7 +253,7 @@ EXPORT_SYMBOL(sbus_set_sbus64);
 static void *sbus_alloc_coherent(struct device *dev, size_t len,
                                 dma_addr_t *dma_addrp, gfp_t gfp)
 {
-       struct of_device *op = to_of_device(dev);
+       struct platform_device *op = to_platform_device(dev);
        unsigned long len_total = (len + PAGE_SIZE-1) & PAGE_MASK;
        unsigned long va;
        struct resource *res;
index 47e63f1e719c7a2d9e4d4e757b1bf0a07e16d308..2d055a1e9cc2b483d2aebbae083b21ddea0bf5ec 100644 (file)
@@ -241,10 +241,10 @@ static int __init use_1to1_mapping(struct device_node *pp)
 
 static int of_resource_verbose;
 
-static void __init build_device_resources(struct of_device *op,
+static void __init build_device_resources(struct platform_device *op,
                                          struct device *parent)
 {
-       struct of_device *p_op;
+       struct platform_device *p_op;
        struct of_bus *bus;
        int na, ns;
        int index, num_reg;
@@ -253,7 +253,7 @@ static void __init build_device_resources(struct of_device *op,
        if (!parent)
                return;
 
-       p_op = to_of_device(parent);
+       p_op = to_platform_device(parent);
        bus = of_match_bus(p_op->dev.of_node);
        bus->count_cells(op->dev.of_node, &na, &ns);
 
@@ -267,6 +267,8 @@ static void __init build_device_resources(struct of_device *op,
        /* Conver to num-entries.  */
        num_reg /= na + ns;
 
+       op->resource = op->archdata.resource;
+       op->num_resources = num_reg;
        for (index = 0; index < num_reg; index++) {
                struct resource *r = &op->resource[index];
                u32 addr[OF_MAX_ADDR_CELLS];
@@ -333,10 +335,10 @@ static void __init build_device_resources(struct of_device *op,
        }
 }
 
-static struct of_device * __init scan_one_device(struct device_node *dp,
+static struct platform_device * __init scan_one_device(struct device_node *dp,
                                                 struct device *parent)
 {
-       struct of_device *op = kzalloc(sizeof(*op), GFP_KERNEL);
+       struct platform_device *op = kzalloc(sizeof(*op), GFP_KERNEL);
        const struct linux_prom_irqs *intr;
        struct dev_archdata *sd;
        int len, i;
@@ -349,27 +351,21 @@ static struct of_device * __init scan_one_device(struct device_node *dp,
 
        op->dev.of_node = dp;
 
-       op->clock_freq = of_getintprop_default(dp, "clock-frequency",
-                                              (25*1000*1000));
-       op->portid = of_getintprop_default(dp, "upa-portid", -1);
-       if (op->portid == -1)
-               op->portid = of_getintprop_default(dp, "portid", -1);
-
        intr = of_get_property(dp, "intr", &len);
        if (intr) {
-               op->num_irqs = len / sizeof(struct linux_prom_irqs);
-               for (i = 0; i < op->num_irqs; i++)
-                       op->irqs[i] = intr[i].pri;
+               op->archdata.num_irqs = len / sizeof(struct linux_prom_irqs);
+               for (i = 0; i < op->archdata.num_irqs; i++)
+                       op->archdata.irqs[i] = intr[i].pri;
        } else {
                const unsigned int *irq =
                        of_get_property(dp, "interrupts", &len);
 
                if (irq) {
-                       op->num_irqs = len / sizeof(unsigned int);
-                       for (i = 0; i < op->num_irqs; i++)
-                               op->irqs[i] = irq[i];
+                       op->archdata.num_irqs = len / sizeof(unsigned int);
+                       for (i = 0; i < op->archdata.num_irqs; i++)
+                               op->archdata.irqs[i] = irq[i];
                } else {
-                       op->num_irqs = 0;
+                       op->archdata.num_irqs = 0;
                }
        }
        if (sparc_cpu_model == sun4d) {
@@ -411,8 +407,8 @@ static struct of_device * __init scan_one_device(struct device_node *dp,
                        goto build_resources;
                }
 
-               for (i = 0; i < op->num_irqs; i++) {
-                       int this_irq = op->irqs[i];
+               for (i = 0; i < op->archdata.num_irqs; i++) {
+                       int this_irq = op->archdata.irqs[i];
                        int sbusl = pil_to_sbus[this_irq];
 
                        if (sbusl)
@@ -420,7 +416,7 @@ static struct of_device * __init scan_one_device(struct device_node *dp,
                                            (sbusl << 2) +
                                            slot);
 
-                       op->irqs[i] = this_irq;
+                       op->archdata.irqs[i] = this_irq;
                }
        }
 
@@ -428,7 +424,7 @@ build_resources:
        build_device_resources(op, parent);
 
        op->dev.parent = parent;
-       op->dev.bus = &of_platform_bus_type;
+       op->dev.bus = &platform_bus_type;
        if (!parent)
                dev_set_name(&op->dev, "root");
        else
@@ -447,7 +443,7 @@ build_resources:
 static void __init scan_tree(struct device_node *dp, struct device *parent)
 {
        while (dp) {
-               struct of_device *op = scan_one_device(dp, parent);
+               struct platform_device *op = scan_one_device(dp, parent);
 
                if (op)
                        scan_tree(dp->child, &op->dev);
@@ -456,30 +452,19 @@ static void __init scan_tree(struct device_node *dp, struct device *parent)
        }
 }
 
-static void __init scan_of_devices(void)
+static int __init scan_of_devices(void)
 {
        struct device_node *root = of_find_node_by_path("/");
-       struct of_device *parent;
+       struct platform_device *parent;
 
        parent = scan_one_device(root, NULL);
        if (!parent)
-               return;
+               return 0;
 
        scan_tree(root->child, &parent->dev);
+       return 0;
 }
-
-static int __init of_bus_driver_init(void)
-{
-       int err;
-
-       err = of_bus_type_init(&of_platform_bus_type, "of");
-       if (!err)
-               scan_of_devices();
-
-       return err;
-}
-
-postcore_initcall(of_bus_driver_init);
+postcore_initcall(scan_of_devices);
 
 static int __init of_debug(char *str)
 {
index 1dae8079f7287a7d52631bb589899c93f3c146d0..63cd4e5d47c2a62eb9264b8e01334027a7ebcaeb 100644 (file)
@@ -310,10 +310,10 @@ static int __init use_1to1_mapping(struct device_node *pp)
 
 static int of_resource_verbose;
 
-static void __init build_device_resources(struct of_device *op,
+static void __init build_device_resources(struct platform_device *op,
                                          struct device *parent)
 {
-       struct of_device *p_op;
+       struct platform_device *p_op;
        struct of_bus *bus;
        int na, ns;
        int index, num_reg;
@@ -322,7 +322,7 @@ static void __init build_device_resources(struct of_device *op,
        if (!parent)
                return;
 
-       p_op = to_of_device(parent);
+       p_op = to_platform_device(parent);
        bus = of_match_bus(p_op->dev.of_node);
        bus->count_cells(op->dev.of_node, &na, &ns);
 
@@ -344,6 +344,8 @@ static void __init build_device_resources(struct of_device *op,
                num_reg = PROMREG_MAX;
        }
 
+       op->resource = op->archdata.resource;
+       op->num_resources = num_reg;
        for (index = 0; index < num_reg; index++) {
                struct resource *r = &op->resource[index];
                u32 addr[OF_MAX_ADDR_CELLS];
@@ -526,7 +528,7 @@ static unsigned int __init pci_irq_swizzle(struct device_node *dp,
 
 static int of_irq_verbose;
 
-static unsigned int __init build_one_device_irq(struct of_device *op,
+static unsigned int __init build_one_device_irq(struct platform_device *op,
                                                struct device *parent,
                                                unsigned int irq)
 {
@@ -628,10 +630,10 @@ out:
        return irq;
 }
 
-static struct of_device * __init scan_one_device(struct device_node *dp,
+static struct platform_device * __init scan_one_device(struct device_node *dp,
                                                 struct device *parent)
 {
-       struct of_device *op = kzalloc(sizeof(*op), GFP_KERNEL);
+       struct platform_device *op = kzalloc(sizeof(*op), GFP_KERNEL);
        const unsigned int *irq;
        struct dev_archdata *sd;
        int len, i;
@@ -644,34 +646,28 @@ static struct of_device * __init scan_one_device(struct device_node *dp,
 
        op->dev.of_node = dp;
 
-       op->clock_freq = of_getintprop_default(dp, "clock-frequency",
-                                              (25*1000*1000));
-       op->portid = of_getintprop_default(dp, "upa-portid", -1);
-       if (op->portid == -1)
-               op->portid = of_getintprop_default(dp, "portid", -1);
-
        irq = of_get_property(dp, "interrupts", &len);
        if (irq) {
-               op->num_irqs = len / 4;
+               op->archdata.num_irqs = len / 4;
 
                /* Prevent overrunning the op->irqs[] array.  */
-               if (op->num_irqs > PROMINTR_MAX) {
+               if (op->archdata.num_irqs > PROMINTR_MAX) {
                        printk(KERN_WARNING "%s: Too many irqs (%d), "
                               "limiting to %d.\n",
-                              dp->full_name, op->num_irqs, PROMINTR_MAX);
-                       op->num_irqs = PROMINTR_MAX;
+                              dp->full_name, op->archdata.num_irqs, PROMINTR_MAX);
+                       op->archdata.num_irqs = PROMINTR_MAX;
                }
-               memcpy(op->irqs, irq, op->num_irqs * 4);
+               memcpy(op->archdata.irqs, irq, op->archdata.num_irqs * 4);
        } else {
-               op->num_irqs = 0;
+               op->archdata.num_irqs = 0;
        }
 
        build_device_resources(op, parent);
-       for (i = 0; i < op->num_irqs; i++)
-               op->irqs[i] = build_one_device_irq(op, parent, op->irqs[i]);
+       for (i = 0; i < op->archdata.num_irqs; i++)
+               op->archdata.irqs[i] = build_one_device_irq(op, parent, op->archdata.irqs[i]);
 
        op->dev.parent = parent;
-       op->dev.bus = &of_platform_bus_type;
+       op->dev.bus = &platform_bus_type;
        if (!parent)
                dev_set_name(&op->dev, "root");
        else
@@ -690,7 +686,7 @@ static struct of_device * __init scan_one_device(struct device_node *dp,
 static void __init scan_tree(struct device_node *dp, struct device *parent)
 {
        while (dp) {
-               struct of_device *op = scan_one_device(dp, parent);
+               struct platform_device *op = scan_one_device(dp, parent);
 
                if (op)
                        scan_tree(dp->child, &op->dev);
@@ -699,30 +695,19 @@ static void __init scan_tree(struct device_node *dp, struct device *parent)
        }
 }
 
-static void __init scan_of_devices(void)
+static int __init scan_of_devices(void)
 {
        struct device_node *root = of_find_node_by_path("/");
-       struct of_device *parent;
+       struct platform_device *parent;
 
        parent = scan_one_device(root, NULL);
        if (!parent)
-               return;
+               return 0;
 
        scan_tree(root->child, &parent->dev);
+       return 0;
 }
-
-static int __init of_bus_driver_init(void)
-{
-       int err;
-
-       err = of_bus_type_init(&of_platform_bus_type, "of");
-       if (!err)
-               scan_of_devices();
-
-       return err;
-}
-
-postcore_initcall(of_bus_driver_init);
+postcore_initcall(scan_of_devices);
 
 static int __init of_debug(char *str)
 {
index 10c6c36a6e7565a7716cb98c7107f089e232f3fa..49ddff56cb04130ce1a84ccb0ed152ebf6516e9a 100644 (file)
 
 #include "of_device_common.h"
 
-static int node_match(struct device *dev, void *data)
-{
-       struct of_device *op = to_of_device(dev);
-       struct device_node *dp = data;
-
-       return (op->dev.of_node == dp);
-}
-
-struct of_device *of_find_device_by_node(struct device_node *dp)
-{
-       struct device *dev = bus_find_device(&of_platform_bus_type, NULL,
-                                            dp, node_match);
-
-       if (dev)
-               return to_of_device(dev);
-
-       return NULL;
-}
-EXPORT_SYMBOL(of_find_device_by_node);
-
 unsigned int irq_of_parse_and_map(struct device_node *node, int index)
 {
-       struct of_device *op = of_find_device_by_node(node);
+       struct platform_device *op = of_find_device_by_node(node);
 
-       if (!op || index >= op->num_irqs)
+       if (!op || index >= op->archdata.num_irqs)
                return 0;
 
-       return op->irqs[index];
+       return op->archdata.irqs[index];
 }
 EXPORT_SYMBOL(irq_of_parse_and_map);
 
 /* Take the archdata values for IOMMU, STC, and HOSTDATA found in
- * BUS and propagate to all child of_device objects.
+ * BUS and propagate to all child platform_device objects.
  */
-void of_propagate_archdata(struct of_device *bus)
+void of_propagate_archdata(struct platform_device *bus)
 {
        struct dev_archdata *bus_sd = &bus->dev.archdata;
        struct device_node *bus_dp = bus->dev.of_node;
        struct device_node *dp;
 
        for (dp = bus_dp->child; dp; dp = dp->sibling) {
-               struct of_device *op = of_find_device_by_node(dp);
+               struct platform_device *op = of_find_device_by_node(dp);
 
                op->dev.archdata.iommu = bus_sd->iommu;
                op->dev.archdata.stc = bus_sd->stc;
@@ -64,9 +44,6 @@ void of_propagate_archdata(struct of_device *bus)
        }
 }
 
-struct bus_type of_platform_bus_type;
-EXPORT_SYMBOL(of_platform_bus_type);
-
 static void get_cells(struct device_node *dp, int *addrc, int *sizec)
 {
        if (addrc)
index 8a8363adb8bd1ac68c1ad49e6afba66dc7b43ae5..4137579d9adcd171157c5ebd9909c43b2b533547 100644 (file)
@@ -198,7 +198,7 @@ static unsigned long pci_parse_of_flags(u32 addr0)
  * into physical address resources, we only have to figure out the register
  * mapping.
  */
-static void pci_parse_of_addrs(struct of_device *op,
+static void pci_parse_of_addrs(struct platform_device *op,
                               struct device_node *node,
                               struct pci_dev *dev)
 {
@@ -248,7 +248,7 @@ static struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,
 {
        struct dev_archdata *sd;
        struct pci_slot *slot;
-       struct of_device *op;
+       struct platform_device *op;
        struct pci_dev *dev;
        const char *type;
        u32 class;
@@ -340,7 +340,7 @@ static struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,
                dev->hdr_type = PCI_HEADER_TYPE_NORMAL;
                dev->rom_base_reg = PCI_ROM_ADDRESS;
 
-               dev->irq = sd->op->irqs[0];
+               dev->irq = sd->op->archdata.irqs[0];
                if (dev->irq == 0xffffffff)
                        dev->irq = PCI_IRQ_NONE;
        }
index 51cfa09e392ab13f67862c11460e856235b6b9dc..efb896d6875404da7d7d75d140198a24c7a9a849 100644 (file)
@@ -410,7 +410,7 @@ static void pci_fire_hw_init(struct pci_pbm_info *pbm)
 }
 
 static int __devinit pci_fire_pbm_init(struct pci_pbm_info *pbm,
-                                      struct of_device *op, u32 portid)
+                                      struct platform_device *op, u32 portid)
 {
        const struct linux_prom64_registers *regs;
        struct device_node *dp = op->dev.of_node;
@@ -455,7 +455,7 @@ static int __devinit pci_fire_pbm_init(struct pci_pbm_info *pbm,
        return 0;
 }
 
-static int __devinit fire_probe(struct of_device *op,
+static int __devinit fire_probe(struct platform_device *op,
                                const struct of_device_id *match)
 {
        struct device_node *dp = op->dev.of_node;
@@ -518,7 +518,7 @@ static struct of_platform_driver fire_driver = {
 
 static int __init fire_init(void)
 {
-       return of_register_driver(&fire_driver, &of_bus_type);
+       return of_register_platform_driver(&fire_driver);
 }
 
 subsys_initcall(fire_init);
index 03186824327ebc5f66d6a060704dff3e1becda23..e20ed5f06e9c999652af80a730b15455aa6bb773 100644 (file)
@@ -91,7 +91,7 @@ struct pci_pbm_info {
        char                            *name;
 
        /* OBP specific information. */
-       struct of_device                *op;
+       struct platform_device          *op;
        u64                             ino_bitmap;
 
        /* PBM I/O and Memory space resources. */
index 558a70512824252d00e7e8c61396bc10b266c7a2..22eab7cf3b11eacae552083daacd3afff488e7ef 100644 (file)
@@ -285,7 +285,7 @@ static irqreturn_t psycho_ce_intr(int irq, void *dev_id)
 #define  PSYCHO_ECCCTRL_CE      0x2000000000000000UL /* Enable CE INterrupts */
 static void psycho_register_error_handlers(struct pci_pbm_info *pbm)
 {
-       struct of_device *op = of_find_device_by_node(pbm->op->dev.of_node);
+       struct platform_device *op = of_find_device_by_node(pbm->op->dev.of_node);
        unsigned long base = pbm->controller_regs;
        u64 tmp;
        int err;
@@ -302,23 +302,23 @@ static void psycho_register_error_handlers(struct pci_pbm_info *pbm)
         * 5: POWER MANAGEMENT
         */
 
-       if (op->num_irqs < 6)
+       if (op->archdata.num_irqs < 6)
                return;
 
        /* We really mean to ignore the return result here.  Two
         * PCI controller share the same interrupt numbers and
         * drive the same front-end hardware.
         */
-       err = request_irq(op->irqs[1], psycho_ue_intr, IRQF_SHARED,
+       err = request_irq(op->archdata.irqs[1], psycho_ue_intr, IRQF_SHARED,
                          "PSYCHO_UE", pbm);
-       err = request_irq(op->irqs[2], psycho_ce_intr, IRQF_SHARED,
+       err = request_irq(op->archdata.irqs[2], psycho_ce_intr, IRQF_SHARED,
                          "PSYCHO_CE", pbm);
 
        /* This one, however, ought not to fail.  We can just warn
         * about it since the system can still operate properly even
         * if this fails.
         */
-       err = request_irq(op->irqs[0], psycho_pcierr_intr, IRQF_SHARED,
+       err = request_irq(op->archdata.irqs[0], psycho_pcierr_intr, IRQF_SHARED,
                          "PSYCHO_PCIERR", pbm);
        if (err)
                printk(KERN_WARNING "%s: Could not register PCIERR, "
@@ -483,7 +483,7 @@ static void psycho_pbm_strbuf_init(struct pci_pbm_info *pbm,
 #define PSYCHO_MEMSPACE_SIZE   0x07fffffffUL
 
 static void __devinit psycho_pbm_init(struct pci_pbm_info *pbm,
-                                     struct of_device *op, int is_pbm_a)
+                                     struct platform_device *op, int is_pbm_a)
 {
        psycho_pbm_init_common(pbm, op, "PSYCHO", PBM_CHIP_TYPE_PSYCHO);
        psycho_pbm_strbuf_init(pbm, is_pbm_a);
@@ -503,7 +503,7 @@ static struct pci_pbm_info * __devinit psycho_find_sibling(u32 upa_portid)
 
 #define PSYCHO_CONFIGSPACE     0x001000000UL
 
-static int __devinit psycho_probe(struct of_device *op,
+static int __devinit psycho_probe(struct platform_device *op,
                                  const struct of_device_id *match)
 {
        const struct linux_prom64_registers *pr_regs;
@@ -612,7 +612,7 @@ static struct of_platform_driver psycho_driver = {
 
 static int __init psycho_init(void)
 {
-       return of_register_driver(&psycho_driver, &of_bus_type);
+       return of_register_platform_driver(&psycho_driver);
 }
 
 subsys_initcall(psycho_init);
index 6dad8e3b750666c433926d9a9d6963a42cc99de5..5c3f5ec4cabc0ee00d229be774d636eb17b24d77 100644 (file)
@@ -311,7 +311,7 @@ static irqreturn_t sabre_ce_intr(int irq, void *dev_id)
 static void sabre_register_error_handlers(struct pci_pbm_info *pbm)
 {
        struct device_node *dp = pbm->op->dev.of_node;
-       struct of_device *op;
+       struct platform_device *op;
        unsigned long base = pbm->controller_regs;
        u64 tmp;
        int err;
@@ -329,7 +329,7 @@ static void sabre_register_error_handlers(struct pci_pbm_info *pbm)
         * 2: CE ERR
         * 3: POWER FAIL
         */
-       if (op->num_irqs < 4)
+       if (op->archdata.num_irqs < 4)
                return;
 
        /* We clear the error bits in the appropriate AFSR before
@@ -341,7 +341,7 @@ static void sabre_register_error_handlers(struct pci_pbm_info *pbm)
                    SABRE_UEAFSR_SDTE | SABRE_UEAFSR_PDTE),
                   base + SABRE_UE_AFSR);
 
-       err = request_irq(op->irqs[1], sabre_ue_intr, 0, "SABRE_UE", pbm);
+       err = request_irq(op->archdata.irqs[1], sabre_ue_intr, 0, "SABRE_UE", pbm);
        if (err)
                printk(KERN_WARNING "%s: Couldn't register UE, err=%d.\n",
                       pbm->name, err);
@@ -351,11 +351,11 @@ static void sabre_register_error_handlers(struct pci_pbm_info *pbm)
                   base + SABRE_CE_AFSR);
 
 
-       err = request_irq(op->irqs[2], sabre_ce_intr, 0, "SABRE_CE", pbm);
+       err = request_irq(op->archdata.irqs[2], sabre_ce_intr, 0, "SABRE_CE", pbm);
        if (err)
                printk(KERN_WARNING "%s: Couldn't register CE, err=%d.\n",
                       pbm->name, err);
-       err = request_irq(op->irqs[0], psycho_pcierr_intr, 0,
+       err = request_irq(op->archdata.irqs[0], psycho_pcierr_intr, 0,
                          "SABRE_PCIERR", pbm);
        if (err)
                printk(KERN_WARNING "%s: Couldn't register PCIERR, err=%d.\n",
@@ -443,7 +443,7 @@ static void __devinit sabre_scan_bus(struct pci_pbm_info *pbm,
 }
 
 static void __devinit sabre_pbm_init(struct pci_pbm_info *pbm,
-                                    struct of_device *op)
+                                    struct platform_device *op)
 {
        psycho_pbm_init_common(pbm, op, "SABRE", PBM_CHIP_TYPE_SABRE);
        pbm->pci_afsr = pbm->controller_regs + SABRE_PIOAFSR;
@@ -452,7 +452,7 @@ static void __devinit sabre_pbm_init(struct pci_pbm_info *pbm,
        sabre_scan_bus(pbm, &op->dev);
 }
 
-static int __devinit sabre_probe(struct of_device *op,
+static int __devinit sabre_probe(struct platform_device *op,
                                 const struct of_device_id *match)
 {
        const struct linux_prom64_registers *pr_regs;
@@ -606,7 +606,7 @@ static struct of_platform_driver sabre_driver = {
 
 static int __init sabre_init(void)
 {
-       return of_register_driver(&sabre_driver, &of_bus_type);
+       return of_register_platform_driver(&sabre_driver);
 }
 
 subsys_initcall(sabre_init);
index 97a1ae2e1c02ebee8bbcdd221254f80bb46b15b4..445a47a2fb3ddf91305a9004fc699f9e09384b99 100644 (file)
@@ -844,7 +844,7 @@ static int pbm_routes_this_ino(struct pci_pbm_info *pbm, u32 ino)
  */
 static void tomatillo_register_error_handlers(struct pci_pbm_info *pbm)
 {
-       struct of_device *op = of_find_device_by_node(pbm->op->dev.of_node);
+       struct platform_device *op = of_find_device_by_node(pbm->op->dev.of_node);
        u64 tmp, err_mask, err_no_mask;
        int err;
 
@@ -857,14 +857,14 @@ static void tomatillo_register_error_handlers(struct pci_pbm_info *pbm)
         */
 
        if (pbm_routes_this_ino(pbm, SCHIZO_UE_INO)) {
-               err = request_irq(op->irqs[1], schizo_ue_intr, 0,
+               err = request_irq(op->archdata.irqs[1], schizo_ue_intr, 0,
                                  "TOMATILLO_UE", pbm);
                if (err)
                        printk(KERN_WARNING "%s: Could not register UE, "
                               "err=%d\n", pbm->name, err);
        }
        if (pbm_routes_this_ino(pbm, SCHIZO_CE_INO)) {
-               err = request_irq(op->irqs[2], schizo_ce_intr, 0,
+               err = request_irq(op->archdata.irqs[2], schizo_ce_intr, 0,
                                  "TOMATILLO_CE", pbm);
                if (err)
                        printk(KERN_WARNING "%s: Could not register CE, "
@@ -872,10 +872,10 @@ static void tomatillo_register_error_handlers(struct pci_pbm_info *pbm)
        }
        err = 0;
        if (pbm_routes_this_ino(pbm, SCHIZO_PCIERR_A_INO)) {
-               err = request_irq(op->irqs[0], schizo_pcierr_intr, 0,
+               err = request_irq(op->archdata.irqs[0], schizo_pcierr_intr, 0,
                                  "TOMATILLO_PCIERR", pbm);
        } else if (pbm_routes_this_ino(pbm, SCHIZO_PCIERR_B_INO)) {
-               err = request_irq(op->irqs[0], schizo_pcierr_intr, 0,
+               err = request_irq(op->archdata.irqs[0], schizo_pcierr_intr, 0,
                                  "TOMATILLO_PCIERR", pbm);
        }
        if (err)
@@ -883,7 +883,7 @@ static void tomatillo_register_error_handlers(struct pci_pbm_info *pbm)
                       "err=%d\n", pbm->name, err);
 
        if (pbm_routes_this_ino(pbm, SCHIZO_SERR_INO)) {
-               err = request_irq(op->irqs[3], schizo_safarierr_intr, 0,
+               err = request_irq(op->archdata.irqs[3], schizo_safarierr_intr, 0,
                                  "TOMATILLO_SERR", pbm);
                if (err)
                        printk(KERN_WARNING "%s: Could not register SERR, "
@@ -939,7 +939,7 @@ static void tomatillo_register_error_handlers(struct pci_pbm_info *pbm)
 
 static void schizo_register_error_handlers(struct pci_pbm_info *pbm)
 {
-       struct of_device *op = of_find_device_by_node(pbm->op->dev.of_node);
+       struct platform_device *op = of_find_device_by_node(pbm->op->dev.of_node);
        u64 tmp, err_mask, err_no_mask;
        int err;
 
@@ -952,14 +952,14 @@ static void schizo_register_error_handlers(struct pci_pbm_info *pbm)
         */
 
        if (pbm_routes_this_ino(pbm, SCHIZO_UE_INO)) {
-               err = request_irq(op->irqs[1], schizo_ue_intr, 0,
+               err = request_irq(op->archdata.irqs[1], schizo_ue_intr, 0,
                                  "SCHIZO_UE", pbm);
                if (err)
                        printk(KERN_WARNING "%s: Could not register UE, "
                               "err=%d\n", pbm->name, err);
        }
        if (pbm_routes_this_ino(pbm, SCHIZO_CE_INO)) {
-               err = request_irq(op->irqs[2], schizo_ce_intr, 0,
+               err = request_irq(op->archdata.irqs[2], schizo_ce_intr, 0,
                                  "SCHIZO_CE", pbm);
                if (err)
                        printk(KERN_WARNING "%s: Could not register CE, "
@@ -967,10 +967,10 @@ static void schizo_register_error_handlers(struct pci_pbm_info *pbm)
        }
        err = 0;
        if (pbm_routes_this_ino(pbm, SCHIZO_PCIERR_A_INO)) {
-               err = request_irq(op->irqs[0], schizo_pcierr_intr, 0,
+               err = request_irq(op->archdata.irqs[0], schizo_pcierr_intr, 0,
                                  "SCHIZO_PCIERR", pbm);
        } else if (pbm_routes_this_ino(pbm, SCHIZO_PCIERR_B_INO)) {
-               err = request_irq(op->irqs[0], schizo_pcierr_intr, 0,
+               err = request_irq(op->archdata.irqs[0], schizo_pcierr_intr, 0,
                                  "SCHIZO_PCIERR", pbm);
        }
        if (err)
@@ -978,7 +978,7 @@ static void schizo_register_error_handlers(struct pci_pbm_info *pbm)
                       "err=%d\n", pbm->name, err);
 
        if (pbm_routes_this_ino(pbm, SCHIZO_SERR_INO)) {
-               err = request_irq(op->irqs[3], schizo_safarierr_intr, 0,
+               err = request_irq(op->archdata.irqs[3], schizo_safarierr_intr, 0,
                                  "SCHIZO_SERR", pbm);
                if (err)
                        printk(KERN_WARNING "%s: Could not register SERR, "
@@ -1307,7 +1307,7 @@ static void schizo_pbm_hw_init(struct pci_pbm_info *pbm)
 }
 
 static int __devinit schizo_pbm_init(struct pci_pbm_info *pbm,
-                                    struct of_device *op, u32 portid,
+                                    struct platform_device *op, u32 portid,
                                     int chip_type)
 {
        const struct linux_prom64_registers *regs;
@@ -1413,7 +1413,7 @@ static struct pci_pbm_info * __devinit schizo_find_sibling(u32 portid,
        return NULL;
 }
 
-static int __devinit __schizo_init(struct of_device *op, unsigned long chip_type)
+static int __devinit __schizo_init(struct platform_device *op, unsigned long chip_type)
 {
        struct device_node *dp = op->dev.of_node;
        struct pci_pbm_info *pbm;
@@ -1460,7 +1460,7 @@ out_err:
        return err;
 }
 
-static int __devinit schizo_probe(struct of_device *op,
+static int __devinit schizo_probe(struct platform_device *op,
                                  const struct of_device_id *match)
 {
        return __schizo_init(op, (unsigned long) match->data);
@@ -1501,7 +1501,7 @@ static struct of_platform_driver schizo_driver = {
 
 static int __init schizo_init(void)
 {
-       return of_register_driver(&schizo_driver, &of_bus_type);
+       return of_register_platform_driver(&schizo_driver);
 }
 
 subsys_initcall(schizo_init);
index a24af6f7e17f12b125f16d716690e02b663b5f88..743344aa6d8a6a1d6f32738b3e5c1f40352f67d9 100644 (file)
@@ -879,7 +879,7 @@ static void pci_sun4v_msi_init(struct pci_pbm_info *pbm)
 #endif /* !(CONFIG_PCI_MSI) */
 
 static int __devinit pci_sun4v_pbm_init(struct pci_pbm_info *pbm,
-                                       struct of_device *op, u32 devhandle)
+                                       struct platform_device *op, u32 devhandle)
 {
        struct device_node *dp = op->dev.of_node;
        int err;
@@ -918,7 +918,7 @@ static int __devinit pci_sun4v_pbm_init(struct pci_pbm_info *pbm,
        return 0;
 }
 
-static int __devinit pci_sun4v_probe(struct of_device *op,
+static int __devinit pci_sun4v_probe(struct platform_device *op,
                                     const struct of_device_id *match)
 {
        const struct linux_prom64_registers *regs;
@@ -1019,7 +1019,7 @@ static struct of_platform_driver pci_sun4v_driver = {
 
 static int __init pci_sun4v_init(void)
 {
-       return of_register_driver(&pci_sun4v_driver, &of_bus_type);
+       return of_register_platform_driver(&pci_sun4v_driver);
 }
 
 subsys_initcall(pci_sun4v_init);
index 9589d8b9b0c17eb59f5d0d2d1b66a94ac3fd655e..94536a85f16110f69aa89520f574404bc2438daa 100644 (file)
@@ -51,7 +51,7 @@ static void pmc_swift_idle(void)
 #endif
 }
 
-static int __devinit pmc_probe(struct of_device *op,
+static int __devinit pmc_probe(struct platform_device *op,
                               const struct of_device_id *match)
 {
        regs = of_ioremap(&op->resource[0], 0,
@@ -89,7 +89,7 @@ static struct of_platform_driver pmc_driver = {
 
 static int __init pmc_init(void)
 {
-       return of_register_driver(&pmc_driver, &of_bus_type);
+       return of_register_platform_driver(&pmc_driver);
 }
 
 /* This driver is not critical to the boot process
index 168d4cb63f5b34e110f021769adb1f199bee9a1e..2c59f4d387dd6cf68e0c8bcd140be5bb67e551d5 100644 (file)
@@ -33,10 +33,10 @@ static int __devinit has_button_interrupt(unsigned int irq, struct device_node *
        return 1;
 }
 
-static int __devinit power_probe(struct of_device *op, const struct of_device_id *match)
+static int __devinit power_probe(struct platform_device *op, const struct of_device_id *match)
 {
        struct resource *res = &op->resource[0];
-       unsigned int irq= op->irqs[0];
+       unsigned int irq = op->archdata.irqs[0];
 
        power_reg = of_ioremap(res, 0, 0x4, "power");
 
@@ -70,7 +70,7 @@ static struct of_platform_driver power_driver = {
 
 static int __init power_init(void)
 {
-       return of_register_driver(&power_driver, &of_platform_bus_type);
+       return of_register_platform_driver(&power_driver);
 }
 
 device_initcall(power_init);
index a8591ef2636d4e55a64738e836c4a084a840d71c..eeb04a782ec81d3c870d99f64299b5a8f991698e 100644 (file)
@@ -9,14 +9,6 @@ extern void irq_trans_init(struct device_node *dp);
 
 extern unsigned int prom_unique_id;
 
-static inline int is_root_node(const struct device_node *dp)
-{
-       if (!dp)
-               return 0;
-
-       return (dp->parent == NULL);
-}
-
 extern char *build_path_component(struct device_node *dp);
 extern void of_console_init(void);
 
index 466a32763ea82fbe0bd644fb5468459a7fe4196f..86597d9867fd3768dcca56ec3a9263db1deed6fc 100644 (file)
@@ -21,7 +21,7 @@
 #include <linux/mm.h>
 #include <linux/module.h>
 #include <linux/memblock.h>
-#include <linux/of_device.h>
+#include <linux/of.h>
 
 #include <asm/prom.h>
 #include <asm/oplib.h>
@@ -81,7 +81,7 @@ static void __init sun4v_path_component(struct device_node *dp, char *tmp_buf)
                return;
 
        regs = rprop->value;
-       if (!is_root_node(dp->parent)) {
+       if (!of_node_is_root(dp->parent)) {
                sprintf(tmp_buf, "%s@%x,%x",
                        dp->name,
                        (unsigned int) (regs->phys_addr >> 32UL),
@@ -121,7 +121,7 @@ static void __init sun4u_path_component(struct device_node *dp, char *tmp_buf)
                return;
 
        regs = prop->value;
-       if (!is_root_node(dp->parent)) {
+       if (!of_node_is_root(dp->parent)) {
                sprintf(tmp_buf, "%s@%x,%x",
                        dp->name,
                        (unsigned int) (regs->phys_addr >> 32UL),
index 57ac9e28be0caff3b08be55f0228fa8655863739..1f830da2ddf2317df09c8b62340c41050ba55883 100644 (file)
@@ -244,7 +244,7 @@ char * __init build_full_name(struct device_node *dp)
 
        n = prom_early_alloc(len);
        strcpy(n, dp->parent->full_name);
-       if (!is_root_node(dp->parent)) {
+       if (!of_node_is_root(dp->parent)) {
                strcpy(n + plen, "/");
                plen++;
        }
index 5702ad4710cb17e758d01b26c98375df19e9ae41..ce651147fabc7080c29987eba1bb1d8367d61673 100644 (file)
@@ -719,7 +719,7 @@ static unsigned int central_build_irq(struct device_node *dp,
                                      void *_data)
 {
        struct device_node *central_dp = _data;
-       struct of_device *central_op = of_find_device_by_node(central_dp);
+       struct platform_device *central_op = of_find_device_by_node(central_dp);
        struct resource *res;
        unsigned long imap, iclr;
        u32 tmp;
index 3f34ac853931c816d7e004d57d44d7663f859524..fe2af66bb1988ee3eff896223b5f131e06ca06e6 100644 (file)
@@ -447,7 +447,7 @@ int psycho_iommu_init(struct pci_pbm_info *pbm, int tsbsize,
 
 }
 
-void psycho_pbm_init_common(struct pci_pbm_info *pbm, struct of_device *op,
+void psycho_pbm_init_common(struct pci_pbm_info *pbm, struct platform_device *op,
                            const char *chip_name, int chip_type)
 {
        struct device_node *dp = op->dev.of_node;
index 092c278ef28dce5e575daa94723e3e8bd807f758..590b4ed8ab5e844d59a6485355d0b0f04e558c66 100644 (file)
@@ -42,7 +42,7 @@ extern int psycho_iommu_init(struct pci_pbm_info *pbm, int tsbsize,
                             unsigned long write_complete_offset);
 
 extern void psycho_pbm_init_common(struct pci_pbm_info *pbm,
-                                  struct of_device *op,
+                                  struct platform_device *op,
                                   const char *chip_name, int chip_type);
 
 #endif /* _PSYCHO_COMMON_H */
index cfeaf04b9cdf4204cfc5d21f1d8d84bfddb0367d..2ca32d13abcfdbbfbe0a81de61e706d292248b0f 100644 (file)
@@ -57,7 +57,7 @@
 void sbus_set_sbus64(struct device *dev, int bursts)
 {
        struct iommu *iommu = dev->archdata.iommu;
-       struct of_device *op = to_of_device(dev);
+       struct platform_device *op = to_platform_device(dev);
        const struct linux_prom_registers *regs;
        unsigned long cfg_reg;
        int slot;
@@ -204,7 +204,7 @@ static unsigned long sysio_imap_to_iclr(unsigned long imap)
        return imap + diff;
 }
 
-static unsigned int sbus_build_irq(struct of_device *op, unsigned int ino)
+static unsigned int sbus_build_irq(struct platform_device *op, unsigned int ino)
 {
        struct iommu *iommu = op->dev.archdata.iommu;
        unsigned long reg_base = iommu->write_complete_reg - 0x2000UL;
@@ -267,7 +267,7 @@ static unsigned int sbus_build_irq(struct of_device *op, unsigned int ino)
 #define  SYSIO_UEAFSR_RESV2 0x0000001fffffffffUL /* Reserved                  */
 static irqreturn_t sysio_ue_handler(int irq, void *dev_id)
 {
-       struct of_device *op = dev_id;
+       struct platform_device *op = dev_id;
        struct iommu *iommu = op->dev.archdata.iommu;
        unsigned long reg_base = iommu->write_complete_reg - 0x2000UL;
        unsigned long afsr_reg, afar_reg;
@@ -341,7 +341,7 @@ static irqreturn_t sysio_ue_handler(int irq, void *dev_id)
 #define  SYSIO_CEAFSR_RESV2 0x0000001fffffffffUL /* Reserved                  */
 static irqreturn_t sysio_ce_handler(int irq, void *dev_id)
 {
-       struct of_device *op = dev_id;
+       struct platform_device *op = dev_id;
        struct iommu *iommu = op->dev.archdata.iommu;
        unsigned long reg_base = iommu->write_complete_reg - 0x2000UL;
        unsigned long afsr_reg, afar_reg;
@@ -420,7 +420,7 @@ static irqreturn_t sysio_ce_handler(int irq, void *dev_id)
 #define  SYSIO_SBAFSR_RESV3 0x0000001fffffffffUL /* Reserved                  */
 static irqreturn_t sysio_sbus_error_handler(int irq, void *dev_id)
 {
-       struct of_device *op = dev_id;
+       struct platform_device *op = dev_id;
        struct iommu *iommu = op->dev.archdata.iommu;
        unsigned long afsr_reg, afar_reg, reg_base;
        unsigned long afsr, afar, error_bits;
@@ -488,7 +488,7 @@ static irqreturn_t sysio_sbus_error_handler(int irq, void *dev_id)
 #define SYSIO_CE_INO           0x35
 #define SYSIO_SBUSERR_INO      0x36
 
-static void __init sysio_register_error_handlers(struct of_device *op)
+static void __init sysio_register_error_handlers(struct platform_device *op)
 {
        struct iommu *iommu = op->dev.archdata.iommu;
        unsigned long reg_base = iommu->write_complete_reg - 0x2000UL;
@@ -534,7 +534,7 @@ static void __init sysio_register_error_handlers(struct of_device *op)
 }
 
 /* Boot time initialization. */
-static void __init sbus_iommu_init(struct of_device *op)
+static void __init sbus_iommu_init(struct platform_device *op)
 {
        const struct linux_prom64_registers *pr;
        struct device_node *dp = op->dev.of_node;
@@ -663,7 +663,7 @@ static int __init sbus_init(void)
        struct device_node *dp;
 
        for_each_node_by_name(dp, "sbus") {
-               struct of_device *op = of_find_device_by_node(dp);
+               struct platform_device *op = of_find_device_by_node(dp);
 
                sbus_iommu_init(op);
                of_propagate_archdata(op);
index e404b063be2cbc1d141c899c2e91f1ad79463989..9c743b1886fff4314caf7487065aa8852f8db1e7 100644 (file)
@@ -142,7 +142,7 @@ static struct platform_device m48t59_rtc = {
        },
 };
 
-static int __devinit clock_probe(struct of_device *op, const struct of_device_id *match)
+static int __devinit clock_probe(struct platform_device *op, const struct of_device_id *match)
 {
        struct device_node *dp = op->dev.of_node;
        const char *model = of_get_property(dp, "model", NULL);
@@ -189,7 +189,7 @@ static struct of_platform_driver clock_driver = {
 /* Probe for the mostek real time clock chip. */
 static int __init clock_init(void)
 {
-       return of_register_driver(&clock_driver, &of_platform_bus_type);
+       return of_register_platform_driver(&clock_driver);
 }
 /* Must be after subsys_initcall() so that busses are probed.  Must
  * be before device_initcall() because things like the RTC driver
index 21e9fcae0668cdb7994ca856b428fa4a7a74b6e1..3bc9c9979b92fd1533caab3a5d1b8959c4c8855e 100644 (file)
@@ -419,7 +419,7 @@ static struct platform_device rtc_cmos_device = {
        .num_resources  = 1,
 };
 
-static int __devinit rtc_probe(struct of_device *op, const struct of_device_id *match)
+static int __devinit rtc_probe(struct platform_device *op, const struct of_device_id *match)
 {
        struct resource *r;
 
@@ -477,7 +477,7 @@ static struct platform_device rtc_bq4802_device = {
        .num_resources  = 1,
 };
 
-static int __devinit bq4802_probe(struct of_device *op, const struct of_device_id *match)
+static int __devinit bq4802_probe(struct platform_device *op, const struct of_device_id *match)
 {
 
        printk(KERN_INFO "%s: BQ4802 regs at 0x%llx\n",
@@ -534,7 +534,7 @@ static struct platform_device m48t59_rtc = {
        },
 };
 
-static int __devinit mostek_probe(struct of_device *op, const struct of_device_id *match)
+static int __devinit mostek_probe(struct platform_device *op, const struct of_device_id *match)
 {
        struct device_node *dp = op->dev.of_node;
 
@@ -586,9 +586,9 @@ static int __init clock_init(void)
        if (tlb_type == hypervisor)
                return platform_device_register(&rtc_sun4v_device);
 
-       (void) of_register_driver(&rtc_driver, &of_platform_bus_type);
-       (void) of_register_driver(&mostek_driver, &of_platform_bus_type);
-       (void) of_register_driver(&bq4802_driver, &of_platform_bus_type);
+       (void) of_register_platform_driver(&rtc_driver);
+       (void) of_register_platform_driver(&mostek_driver);
+       (void) of_register_platform_driver(&bq4802_driver);
 
        return 0;
 }
index 005e758a4db7fe9cb381c3ddd3955137298e4fad..fc58c3e917dfeb87bb6674136f6531617782dbe9 100644 (file)
@@ -35,7 +35,7 @@
 #define IOPERM        (IOUPTE_CACHE | IOUPTE_WRITE | IOUPTE_VALID)
 #define MKIOPTE(phys) __iopte((((phys)>>4) & IOUPTE_PAGE) | IOPERM)
 
-static void __init iounit_iommu_init(struct of_device *op)
+static void __init iounit_iommu_init(struct platform_device *op)
 {
        struct iounit_struct *iounit;
        iopte_t *xpt, *xptend;
@@ -74,7 +74,7 @@ static int __init iounit_init(void)
        struct device_node *dp;
 
        for_each_node_by_name(dp, "sbi") {
-               struct of_device *op = of_find_device_by_node(dp);
+               struct platform_device *op = of_find_device_by_node(dp);
 
                iounit_iommu_init(op);
                of_propagate_archdata(op);
index 0e8ae298b3c3a7e8fedd26e93a6204915b887775..07fc6a65d9b622f6b1fccb73d559567cdeb8a18f 100644 (file)
@@ -56,7 +56,7 @@ static pgprot_t dvma_prot;            /* Consistent mapping pte flags */
 #define IOPERM        (IOPTE_CACHE | IOPTE_WRITE | IOPTE_VALID)
 #define MKIOPTE(pfn, perm) (((((pfn)<<8) & IOPTE_PAGE) | (perm)) & ~IOPTE_WAZ)
 
-static void __init sbus_iommu_init(struct of_device *op)
+static void __init sbus_iommu_init(struct platform_device *op)
 {
        struct iommu_struct *iommu;
        unsigned int impl, vers;
@@ -132,7 +132,7 @@ static int __init iommu_init(void)
        struct device_node *dp;
 
        for_each_node_by_name(dp, "iommu") {
-               struct of_device *op = of_find_device_by_node(dp);
+               struct platform_device *op = of_find_device_by_node(dp);
 
                sbus_iommu_init(op);
                of_propagate_archdata(op);
index da8f176c051e19e164b0fdc362b3ba77d3e89738..b7385e0777176413c2497b780797e81189888632 100644 (file)
@@ -2657,7 +2657,7 @@ static int __devinit fore200e_sba_probe(struct of_device *op,
 
        fore200e->bus = bus;
        fore200e->bus_dev = op;
-       fore200e->irq = op->irqs[0];
+       fore200e->irq = op->archdata.irqs[0];
        fore200e->phys_base = op->resource[0].start;
 
        sprintf(fore200e->name, "%s-%d", bus->model_name, index);
@@ -2795,7 +2795,7 @@ static int __init fore200e_module_init(void)
        printk(FORE200E "FORE Systems 200E-series ATM driver - version " FORE200E_VERSION "\n");
 
 #ifdef CONFIG_SBUS
-       err = of_register_driver(&fore200e_sba_driver, &of_bus_type);
+       err = of_register_platform_driver(&fore200e_sba_driver);
        if (err)
                return err;
 #endif
@@ -2806,7 +2806,7 @@ static int __init fore200e_module_init(void)
 
 #ifdef CONFIG_SBUS
        if (err)
-               of_unregister_driver(&fore200e_sba_driver);
+               of_unregister_platform_driver(&fore200e_sba_driver);
 #endif
 
        return err;
@@ -2818,7 +2818,7 @@ static void __exit fore200e_module_cleanup(void)
        pci_unregister_driver(&fore200e_pca_driver);
 #endif
 #ifdef CONFIG_SBUS
-       of_unregister_driver(&fore200e_sba_driver);
+       of_unregister_platform_driver(&fore200e_sba_driver);
 #endif
 }
 
index 4d99c8bdfedcd8f062c9e7924e0698cf692b81de..f699fabf403bedd931fd457a2c200faef58ad7ea 100644 (file)
@@ -12,6 +12,7 @@
 
 #include <linux/string.h>
 #include <linux/platform_device.h>
+#include <linux/of_device.h>
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/dma-mapping.h>
@@ -635,6 +636,12 @@ static struct device_attribute platform_dev_attrs[] = {
 static int platform_uevent(struct device *dev, struct kobj_uevent_env *env)
 {
        struct platform_device  *pdev = to_platform_device(dev);
+       int rc;
+
+       /* Some devices have extra OF data and an OF-style MODALIAS */
+       rc = of_device_uevent(dev,env);
+       if (rc != -ENODEV)
+               return rc;
 
        add_uevent_var(env, "MODALIAS=%s%s", PLATFORM_MODULE_PREFIX,
                (pdev->id_entry) ? pdev->id_entry->name : pdev->name);
@@ -673,7 +680,11 @@ static int platform_match(struct device *dev, struct device_driver *drv)
        struct platform_device *pdev = to_platform_device(dev);
        struct platform_driver *pdrv = to_platform_driver(drv);
 
-       /* match against the id table first */
+       /* Attempt an OF style match first */
+       if (of_driver_match_device(dev, drv))
+               return 1;
+
+       /* Then try to match against the id table */
        if (pdrv->id_table)
                return platform_match_id(pdrv->id_table, pdev) != NULL;
 
index 89d871ef8c2f814dbaecc390bd47fa34ad14574c..91917133ae0ad7de08d58a9379e943c9ecef2988 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/of_platform.h>
+#include <linux/fs.h>
 #include <linux/module.h>
 #include <linux/cdev.h>
 #include <linux/list.h>
index 101d5f2355470b8e62b148cefd27e70807bd33e1..7a4f080f8356e7657375debd0a0e9cf7c8b15a6e 100644 (file)
@@ -762,12 +762,12 @@ static struct of_platform_driver n2rng_driver = {
 
 static int __init n2rng_init(void)
 {
-       return of_register_driver(&n2rng_driver, &of_bus_type);
+       return of_register_platform_driver(&n2rng_driver);
 }
 
 static void __exit n2rng_exit(void)
 {
-       of_unregister_driver(&n2rng_driver);
+       of_unregister_platform_driver(&n2rng_driver);
 }
 
 module_init(n2rng_init);
index b99c38f23d6137337a7c4f49270a31fd9fa1de36..26af2dd5d8316e73cf95f966aa215ae7ebb1dd37 100644 (file)
@@ -2247,20 +2247,20 @@ static struct of_platform_driver n2_mau_driver = {
 
 static int __init n2_init(void)
 {
-       int err = of_register_driver(&n2_crypto_driver, &of_bus_type);
+       int err = of_register_platform_driver(&n2_crypto_driver);
 
        if (!err) {
-               err = of_register_driver(&n2_mau_driver, &of_bus_type);
+               err = of_register_platform_driver(&n2_mau_driver);
                if (err)
-                       of_unregister_driver(&n2_crypto_driver);
+                       of_unregister_platform_driver(&n2_crypto_driver);
        }
        return err;
 }
 
 static void __exit n2_exit(void)
 {
-       of_unregister_driver(&n2_mau_driver);
-       of_unregister_driver(&n2_crypto_driver);
+       of_unregister_platform_driver(&n2_mau_driver);
+       of_unregister_platform_driver(&n2_crypto_driver);
 }
 
 module_init(n2_init);
index 4e51fe3c1fc4f97594d96fcb9a4e719fa40b8edc..6a6bd569e1f8c80851a553b9a4b1c98a76de9faa 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/debugfs.h>
 #include <linux/seq_file.h>
 #include <linux/gpio.h>
+#include <linux/of_gpio.h>
 #include <linux/idr.h>
 #include <linux/slab.h>
 
@@ -1100,16 +1101,24 @@ int gpiochip_add(struct gpio_chip *chip)
                }
        }
 
+       of_gpiochip_add(chip);
+
 unlock:
        spin_unlock_irqrestore(&gpio_lock, flags);
-       if (status == 0)
-               status = gpiochip_export(chip);
+
+       if (status)
+               goto fail;
+
+       status = gpiochip_export(chip);
+       if (status)
+               goto fail;
+
+       return 0;
 fail:
        /* failures here can mean systems won't boot... */
-       if (status)
-               pr_err("gpiochip_add: gpios %d..%d (%s) failed to register\n",
-                       chip->base, chip->base + chip->ngpio - 1,
-                       chip->label ? : "generic");
+       pr_err("gpiochip_add: gpios %d..%d (%s) failed to register\n",
+               chip->base, chip->base + chip->ngpio - 1,
+               chip->label ? : "generic");
        return status;
 }
 EXPORT_SYMBOL_GPL(gpiochip_add);
@@ -1128,6 +1137,8 @@ int gpiochip_remove(struct gpio_chip *chip)
 
        spin_lock_irqsave(&gpio_lock, flags);
 
+       of_gpiochip_remove(chip);
+
        for (id = chip->base; id < chip->base + chip->ngpio; id++) {
                if (test_bit(FLAG_REQUESTED, &gpio_desc[id].flags)) {
                        status = -EBUSY;
@@ -1148,6 +1159,38 @@ int gpiochip_remove(struct gpio_chip *chip)
 }
 EXPORT_SYMBOL_GPL(gpiochip_remove);
 
+/**
+ * gpiochip_find() - iterator for locating a specific gpio_chip
+ * @data: data to pass to match function
+ * @callback: Callback function to check gpio_chip
+ *
+ * Similar to bus_find_device.  It returns a reference to a gpio_chip as
+ * determined by a user supplied @match callback.  The callback should return
+ * 0 if the device doesn't match and non-zero if it does.  If the callback is
+ * non-zero, this function will return to the caller and not iterate over any
+ * more gpio_chips.
+ */
+struct gpio_chip *gpiochip_find(void *data,
+                               int (*match)(struct gpio_chip *chip, void *data))
+{
+       struct gpio_chip *chip = NULL;
+       unsigned long flags;
+       int i;
+
+       spin_lock_irqsave(&gpio_lock, flags);
+       for (i = 0; i < ARCH_NR_GPIOS; i++) {
+               if (!gpio_desc[i].chip)
+                       continue;
+
+               if (match(gpio_desc[i].chip, data)) {
+                       chip = gpio_desc[i].chip;
+                       break;
+               }
+       }
+       spin_unlock_irqrestore(&gpio_lock, flags);
+
+       return chip;
+}
 
 /* These "optional" allocation calls help prevent drivers from stomping
  * on each other, and help provide better diagnostics in debugfs.
index b8fa65b5bfca56ca8320e23916d45dbc56a68b1c..709690995d0d729efd8994a342f06bc402fff0cd 100644 (file)
@@ -161,14 +161,12 @@ static void xgpio_save_regs(struct of_mm_gpio_chip *mm_gc)
 static int __devinit xgpio_of_probe(struct device_node *np)
 {
        struct xgpio_instance *chip;
-       struct of_gpio_chip *ofchip;
        int status = 0;
        const u32 *tree_info;
 
        chip = kzalloc(sizeof(*chip), GFP_KERNEL);
        if (!chip)
                return -ENOMEM;
-       ofchip = &chip->mmchip.of_gc;
 
        /* Update GPIO state shadow register with default value */
        tree_info = of_get_property(np, "xlnx,dout-default", NULL);
@@ -182,21 +180,20 @@ static int __devinit xgpio_of_probe(struct device_node *np)
                chip->gpio_dir = *tree_info;
 
        /* Check device node and parent device node for device width */
-       ofchip->gc.ngpio = 32; /* By default assume full GPIO controller */
+       chip->mmchip.gc.ngpio = 32; /* By default assume full GPIO controller */
        tree_info = of_get_property(np, "xlnx,gpio-width", NULL);
        if (!tree_info)
                tree_info = of_get_property(np->parent,
                                            "xlnx,gpio-width", NULL);
        if (tree_info)
-               ofchip->gc.ngpio = *tree_info;
+               chip->mmchip.gc.ngpio = *tree_info;
 
        spin_lock_init(&chip->gpio_lock);
 
-       ofchip->gpio_cells = 2;
-       ofchip->gc.direction_input = xgpio_dir_in;
-       ofchip->gc.direction_output = xgpio_dir_out;
-       ofchip->gc.get = xgpio_get;
-       ofchip->gc.set = xgpio_set;
+       chip->mmchip.gc.direction_input = xgpio_dir_in;
+       chip->mmchip.gc.direction_output = xgpio_dir_out;
+       chip->mmchip.gc.get = xgpio_get;
+       chip->mmchip.gc.set = xgpio_set;
 
        chip->mmchip.save_regs = xgpio_save_regs;
 
index 5da5942cf970763be13b716c5bd2a3c10d1af3ab..89643261ccdb93aecc42eb5d735bda668b64c0eb 100644 (file)
@@ -311,12 +311,12 @@ static struct of_platform_driver env_driver = {
 
 static int __init env_init(void)
 {
-       return of_register_driver(&env_driver, &of_bus_type);
+       return of_register_platform_driver(&env_driver);
 }
 
 static void __exit env_exit(void)
 {
-       of_unregister_driver(&env_driver);
+       of_unregister_platform_driver(&env_driver);
 }
 
 module_init(env_init);
index b02b4533651d8076f522e96923b09b3f3e8b289b..e591de1bc7044260f0735731cf6b6981e3f075bc 100644 (file)
@@ -652,6 +652,7 @@ static int __devinit cpm_i2c_probe(struct of_device *ofdev,
        cpm->adap = cpm_ops;
        i2c_set_adapdata(&cpm->adap, cpm);
        cpm->adap.dev.parent = &ofdev->dev;
+       cpm->adap.dev.of_node = of_node_get(ofdev->dev.of_node);
 
        result = cpm_i2c_setup(cpm);
        if (result) {
@@ -676,11 +677,6 @@ static int __devinit cpm_i2c_probe(struct of_device *ofdev,
        dev_dbg(&ofdev->dev, "hw routines for %s registered.\n",
                cpm->adap.name);
 
-       /*
-        * register OF I2C devices
-        */
-       of_register_i2c_devices(&cpm->adap, ofdev->dev.of_node);
-
        return 0;
 out_shut:
        cpm_i2c_shutdown(cpm);
index bf344135647a8654a47c8b343c140e68453f40d5..1168d61418c95a86935729b007a03007dd28b371 100644 (file)
@@ -745,6 +745,7 @@ static int __devinit iic_probe(struct of_device *ofdev,
        /* Register it with i2c layer */
        adap = &dev->adap;
        adap->dev.parent = &ofdev->dev;
+       adap->dev.of_node = of_node_get(np);
        strlcpy(adap->name, "IBM IIC", sizeof(adap->name));
        i2c_set_adapdata(adap, dev);
        adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
@@ -760,9 +761,6 @@ static int __devinit iic_probe(struct of_device *ofdev,
        dev_info(&ofdev->dev, "using %s mode\n",
                 dev->fast_mode ? "fast (400 kHz)" : "standard (100 kHz)");
 
-       /* Now register all the child nodes */
-       of_register_i2c_devices(adap, np);
-
        return 0;
 
 error_cleanup:
index 54247d475fc339b7994ccde36d5ba85af79a2f71..6545d1c99b61e157c3570a9adbb9b42ecc1cd440 100644 (file)
@@ -625,13 +625,13 @@ static int __devinit fsl_i2c_probe(struct of_device *op,
        i2c->adap = mpc_ops;
        i2c_set_adapdata(&i2c->adap, i2c);
        i2c->adap.dev.parent = &op->dev;
+       i2c->adap.dev.of_node = of_node_get(op->dev.of_node);
 
        result = i2c_add_adapter(&i2c->adap);
        if (result < 0) {
                dev_err(i2c->dev, "failed to add adapter\n");
                goto fail_add;
        }
-       of_register_i2c_devices(&i2c->adap, op->dev.of_node);
 
        return result;
 
index 0815e10da7c6da3b5ed4974cdb505fc848c43d87..df937df845ebf3b50b3941c9aea569ef3bb7f22b 100644 (file)
@@ -30,6 +30,8 @@
 #include <linux/init.h>
 #include <linux/idr.h>
 #include <linux/mutex.h>
+#include <linux/of_i2c.h>
+#include <linux/of_device.h>
 #include <linux/completion.h>
 #include <linux/hardirq.h>
 #include <linux/irqflags.h>
@@ -70,6 +72,10 @@ static int i2c_device_match(struct device *dev, struct device_driver *drv)
        if (!client)
                return 0;
 
+       /* Attempt an OF style match */
+       if (of_driver_match_device(dev, drv))
+               return 1;
+
        driver = to_i2c_driver(drv);
        /* match on an id table if there is one */
        if (driver->id_table)
@@ -790,6 +796,9 @@ static int i2c_register_adapter(struct i2c_adapter *adap)
        if (adap->nr < __i2c_first_dynamic_bus_num)
                i2c_scan_static_board_info(adap);
 
+       /* Register devices from the device tree */
+       of_i2c_register_devices(adap);
+
        /* Notify drivers */
        mutex_lock(&core_lock);
        dummy = bus_for_each_drv(&i2c_bus_type, NULL, adap,
index 1dacae4b43f0f32671e42934919526c5502a4dcf..f3bb92e9755fa1d7c9516a93b816006655710f93 100644 (file)
@@ -353,14 +353,12 @@ static struct of_platform_driver grover_beep_driver = {
 
 static int __init sparcspkr_init(void)
 {
-       int err = of_register_driver(&bbc_beep_driver,
-                                    &of_platform_bus_type);
+       int err = of_register_platform_driver(&bbc_beep_driver);
 
        if (!err) {
-               err = of_register_driver(&grover_beep_driver,
-                                        &of_platform_bus_type);
+               err = of_register_platform_driver(&grover_beep_driver);
                if (err)
-                       of_unregister_driver(&bbc_beep_driver);
+                       of_unregister_platform_driver(&bbc_beep_driver);
        }
 
        return err;
@@ -368,8 +366,8 @@ static int __init sparcspkr_init(void)
 
 static void __exit sparcspkr_exit(void)
 {
-       of_unregister_driver(&bbc_beep_driver);
-       of_unregister_driver(&grover_beep_driver);
+       of_unregister_platform_driver(&bbc_beep_driver);
+       of_unregister_platform_driver(&grover_beep_driver);
 }
 
 module_init(sparcspkr_init);
index 04e32f2d1241eacc9cfc6716fb22441d2dbd2a3e..cb2a24b947464bfb087a4cf43e6ab0ea939dd5ea 100644 (file)
@@ -58,9 +58,9 @@ static int __devinit sparc_i8042_probe(struct of_device *op, const struct of_dev
                if (!strcmp(dp->name, OBP_PS2KBD_NAME1) ||
                    !strcmp(dp->name, OBP_PS2KBD_NAME2)) {
                        struct of_device *kbd = of_find_device_by_node(dp);
-                       unsigned int irq = kbd->irqs[0];
+                       unsigned int irq = kbd->archdata.irqs[0];
                        if (irq == 0xffffffff)
-                               irq = op->irqs[0];
+                               irq = op->archdata.irqs[0];
                        i8042_kbd_irq = irq;
                        kbd_iobase = of_ioremap(&kbd->resource[0],
                                                0, 8, "kbd");
@@ -68,9 +68,9 @@ static int __devinit sparc_i8042_probe(struct of_device *op, const struct of_dev
                } else if (!strcmp(dp->name, OBP_PS2MS_NAME1) ||
                           !strcmp(dp->name, OBP_PS2MS_NAME2)) {
                        struct of_device *ms = of_find_device_by_node(dp);
-                       unsigned int irq = ms->irqs[0];
+                       unsigned int irq = ms->archdata.irqs[0];
                        if (irq == 0xffffffff)
-                               irq = op->irqs[0];
+                               irq = op->archdata.irqs[0];
                        i8042_aux_irq = irq;
                }
 
@@ -116,8 +116,7 @@ static int __init i8042_platform_init(void)
                if (!kbd_iobase)
                        return -ENODEV;
        } else {
-               int err = of_register_driver(&sparc_i8042_driver,
-                                            &of_bus_type);
+               int err = of_register_platform_driver(&sparc_i8042_driver);
                if (err)
                        return err;
 
@@ -141,7 +140,7 @@ static inline void i8042_platform_exit(void)
        struct device_node *root = of_find_node_by_path("/");
 
        if (strcmp(root->name, "SUNW,JavaStation-1"))
-               of_unregister_driver(&sparc_i8042_driver);
+               of_unregister_platform_driver(&sparc_i8042_driver);
 }
 
 #else /* !CONFIG_PCI */
index 6999ce59fd1091ddd8e9b46f2ced859275deab1c..6024038a5b9dc9a450b6ff655205ea266b632f04 100644 (file)
@@ -41,10 +41,7 @@ compatible_show (struct device *dev, struct device_attribute *attr, char *buf)
 static ssize_t modalias_show (struct device *dev, struct device_attribute *attr,
                              char *buf)
 {
-       struct of_device *ofdev = to_of_device(dev);
-       int len;
-
-       len = of_device_get_modalias(ofdev, buf, PAGE_SIZE - 2);
+       int len = of_device_get_modalias(dev, buf, PAGE_SIZE - 2);
 
        buf[len] = '\n';
        buf[len+1] = 0;
index ad847a24a6756f8f88ec97f6ea8031b8a7169842..7b0f3ef50f9650241918a24cd50f330b2c9c8701 100644 (file)
@@ -1533,12 +1533,20 @@ static int __devexit mmc_spi_remove(struct spi_device *spi)
        return 0;
 }
 
+#if defined(CONFIG_OF)
+static struct of_device_id mmc_spi_of_match_table[] __devinitdata = {
+       { .compatible = "mmc-spi-slot", },
+};
+#endif
 
 static struct spi_driver mmc_spi_driver = {
        .driver = {
                .name =         "mmc_spi",
                .bus =          &spi_bus_type,
                .owner =        THIS_MODULE,
+#if defined(CONFIG_OF)
+               .of_match_table = mmc_spi_of_match_table,
+#endif
        },
        .probe =        mmc_spi_probe,
        .remove =       __devexit_p(mmc_spi_remove),
index 0391c2527bd77ac075bf3a2fbc694b49cc5af939..8984236a8d0a5f93f4d31ba0d26d81abdcd9dea2 100644 (file)
@@ -160,12 +160,12 @@ static struct of_platform_driver uflash_driver = {
 
 static int __init uflash_init(void)
 {
-       return of_register_driver(&uflash_driver, &of_bus_type);
+       return of_register_platform_driver(&uflash_driver);
 }
 
 static void __exit uflash_exit(void)
 {
-       of_unregister_driver(&uflash_driver);
+       of_unregister_platform_driver(&uflash_driver);
 }
 
 module_init(uflash_init);
index b4c41d72c423ef79e004bd901f23ef03f96e311f..f53f850b641888acb1080d6f08402caf2094eccb 100644 (file)
@@ -35,6 +35,7 @@
 #include <linux/mii.h>
 #include <linux/phy.h>
 #include <linux/of.h>
+#include <linux/of_address.h>
 #include <linux/of_mdio.h>
 #include <linux/of_platform.h>
 
index 0f1d4e96cf893884b3e6f0a09fe5c9a41ca75d6d..eeec7bc2ce74bf9c472c9179f621d2e43930ece3 100644 (file)
@@ -2339,11 +2339,11 @@ static int __devinit emac_wait_deps(struct emac_instance *dev)
                deps[EMAC_DEP_MDIO_IDX].phandle = dev->mdio_ph;
        if (dev->blist && dev->blist > emac_boot_list)
                deps[EMAC_DEP_PREV_IDX].phandle = 0xffffffffu;
-       bus_register_notifier(&of_platform_bus_type, &emac_of_bus_notifier);
+       bus_register_notifier(&platform_bus_type, &emac_of_bus_notifier);
        wait_event_timeout(emac_probe_wait,
                           emac_check_deps(dev, deps),
                           EMAC_PROBE_DEP_TIMEOUT);
-       bus_unregister_notifier(&of_platform_bus_type, &emac_of_bus_notifier);
+       bus_unregister_notifier(&platform_bus_type, &emac_of_bus_notifier);
        err = emac_check_deps(dev, deps) ? 0 : -ENODEV;
        for (i = 0; i < EMAC_DEP_COUNT; i++) {
                if (deps[i].node)
index 1a57c3da1f498bb5d21531879ae2d9df941324dd..04e552aa14ec40a756a4155cd787056ee86f5646 100644 (file)
@@ -1079,7 +1079,7 @@ static int __devinit myri_sbus_probe(struct of_device *op, const struct of_devic
 
        mp->dev = dev;
        dev->watchdog_timeo = 5*HZ;
-       dev->irq = op->irqs[0];
+       dev->irq = op->archdata.irqs[0];
        dev->netdev_ops = &myri_ops;
 
        /* Register interrupt handler now. */
@@ -1172,12 +1172,12 @@ static struct of_platform_driver myri_sbus_driver = {
 
 static int __init myri_sbus_init(void)
 {
-       return of_register_driver(&myri_sbus_driver, &of_bus_type);
+       return of_register_platform_driver(&myri_sbus_driver);
 }
 
 static void __exit myri_sbus_exit(void)
 {
-       of_unregister_driver(&myri_sbus_driver);
+       of_unregister_platform_driver(&myri_sbus_driver);
 }
 
 module_init(myri_sbus_init);
index b9b950845b0e7d480a020f997f6707b89258f13e..404f2d552888c4b563472dacae939400de47d6b1 100644 (file)
 #include <linux/slab.h>
 
 #include <linux/io.h>
-
-#ifdef CONFIG_SPARC64
 #include <linux/of_device.h>
-#endif
 
 #include "niu.h"
 
@@ -9114,12 +9111,12 @@ static int __devinit niu_n2_irq_init(struct niu *np, u8 *ldg_num_map)
        if (!int_prop)
                return -ENODEV;
 
-       for (i = 0; i < op->num_irqs; i++) {
+       for (i = 0; i < op->archdata.num_irqs; i++) {
                ldg_num_map[i] = int_prop[i];
-               np->ldg[i].irq = op->irqs[i];
+               np->ldg[i].irq = op->archdata.irqs[i];
        }
 
-       np->num_ldg = op->num_irqs;
+       np->num_ldg = op->archdata.num_irqs;
 
        return 0;
 #else
@@ -10249,14 +10246,14 @@ static int __init niu_init(void)
        niu_debug = netif_msg_init(debug, NIU_MSG_DEFAULT);
 
 #ifdef CONFIG_SPARC64
-       err = of_register_driver(&niu_of_driver, &of_bus_type);
+       err = of_register_platform_driver(&niu_of_driver);
 #endif
 
        if (!err) {
                err = pci_register_driver(&niu_pci_driver);
 #ifdef CONFIG_SPARC64
                if (err)
-                       of_unregister_driver(&niu_of_driver);
+                       of_unregister_platform_driver(&niu_of_driver);
 #endif
        }
 
@@ -10267,7 +10264,7 @@ static void __exit niu_exit(void)
 {
        pci_unregister_driver(&niu_pci_driver);
 #ifdef CONFIG_SPARC64
-       of_unregister_driver(&niu_of_driver);
+       of_unregister_platform_driver(&niu_of_driver);
 #endif
 }
 
index d6715465f35d58137e5c78b26e4c3f653b7c6598..a41fa8ebe05fbfd8e909c61cd2e3862ff6e6f18d 100644 (file)
@@ -3236,7 +3236,7 @@ struct niu_phy_ops {
        int (*link_status)(struct niu *np, int *);
 };
 
-struct of_device;
+struct platform_device;
 struct niu {
        void __iomem                    *regs;
        struct net_device               *dev;
@@ -3297,7 +3297,7 @@ struct niu {
        struct niu_vpd                  vpd;
        u32                             eeprom_len;
 
-       struct of_device                *op;
+       struct platform_device          *op;
        void __iomem                    *vir_regs_1;
        void __iomem                    *vir_regs_2;
 };
index 367e96f317d4d4df298a59945a2d3e3ca7ea9e73..09c071bd6ad421cc5439d87b5727d1810089fe8b 100644 (file)
@@ -1201,7 +1201,7 @@ static int __devinit bigmac_ether_init(struct of_device *op,
        dev->watchdog_timeo = 5*HZ;
 
        /* Finish net device registration. */
-       dev->irq = bp->bigmac_op->irqs[0];
+       dev->irq = bp->bigmac_op->archdata.irqs[0];
        dev->dma = 0;
 
        if (register_netdev(dev)) {
@@ -1301,12 +1301,12 @@ static struct of_platform_driver bigmac_sbus_driver = {
 
 static int __init bigmac_init(void)
 {
-       return of_register_driver(&bigmac_sbus_driver, &of_bus_type);
+       return of_register_platform_driver(&bigmac_sbus_driver);
 }
 
 static void __exit bigmac_exit(void)
 {
-       of_unregister_driver(&bigmac_sbus_driver);
+       of_unregister_platform_driver(&bigmac_sbus_driver);
 }
 
 module_init(bigmac_init);
index 3d9650b8d38fab26fce127f52d7a09ad1170ff6d..eec443f640790ccde8def34cfd06bd6cf77a6700 100644 (file)
@@ -2561,7 +2561,7 @@ static int __init quattro_sbus_register_irqs(void)
                if (skip)
                        continue;
 
-               err = request_irq(op->irqs[0],
+               err = request_irq(op->archdata.irqs[0],
                                  quattro_sbus_interrupt,
                                  IRQF_SHARED, "Quattro",
                                  qp);
@@ -2590,7 +2590,7 @@ static void quattro_sbus_free_irqs(void)
                if (skip)
                        continue;
 
-               free_irq(op->irqs[0], qp);
+               free_irq(op->archdata.irqs[0], qp);
        }
 }
 #endif /* CONFIG_SBUS */
@@ -2790,7 +2790,7 @@ static int __devinit happy_meal_sbus_probe_one(struct of_device *op, int is_qfe)
        /* Happy Meal can do it all... */
        dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM;
 
-       dev->irq = op->irqs[0];
+       dev->irq = op->archdata.irqs[0];
 
 #if defined(CONFIG_SBUS) && defined(CONFIG_PCI)
        /* Hook up SBUS register/descriptor accessors. */
@@ -3304,7 +3304,7 @@ static int __init happy_meal_sbus_init(void)
 {
        int err;
 
-       err = of_register_driver(&hme_sbus_driver, &of_bus_type);
+       err = of_register_platform_driver(&hme_sbus_driver);
        if (!err)
                err = quattro_sbus_register_irqs();
 
@@ -3313,7 +3313,7 @@ static int __init happy_meal_sbus_init(void)
 
 static void happy_meal_sbus_exit(void)
 {
-       of_unregister_driver(&hme_sbus_driver);
+       of_unregister_platform_driver(&hme_sbus_driver);
        quattro_sbus_free_irqs();
 
        while (qfe_sbus_list) {
index 7d9c33dd9d1acf8efc6e9925787678f050a0b80c..ee364fa756342686d12618775790ea37a97f6e49 100644 (file)
@@ -1474,7 +1474,7 @@ no_link_test:
        dev->ethtool_ops = &sparc_lance_ethtool_ops;
        dev->netdev_ops = &sparc_lance_ops;
 
-       dev->irq = op->irqs[0];
+       dev->irq = op->archdata.irqs[0];
 
        /* We cannot sleep if the chip is busy during a
         * multicast list update event, because such events
@@ -1558,12 +1558,12 @@ static struct of_platform_driver sunlance_sbus_driver = {
 /* Find all the lance cards on the system and initialize them */
 static int __init sparc_lance_init(void)
 {
-       return of_register_driver(&sunlance_sbus_driver, &of_bus_type);
+       return of_register_platform_driver(&sunlance_sbus_driver);
 }
 
 static void __exit sparc_lance_exit(void)
 {
-       of_unregister_driver(&sunlance_sbus_driver);
+       of_unregister_platform_driver(&sunlance_sbus_driver);
 }
 
 module_init(sparc_lance_init);
index 72b579c8d8127d4d18c006c22ca631b2be06fe06..5f84a5dadeddd90feca5e72221506c001c416314 100644 (file)
@@ -803,7 +803,7 @@ static struct sunqec * __devinit get_qec(struct of_device *child)
 
                        qec_init_once(qecp, op);
 
-                       if (request_irq(op->irqs[0], qec_interrupt,
+                       if (request_irq(op->archdata.irqs[0], qec_interrupt,
                                        IRQF_SHARED, "qec", (void *) qecp)) {
                                printk(KERN_ERR "qec: Can't register irq.\n");
                                goto fail;
@@ -901,7 +901,7 @@ static int __devinit qec_ether_init(struct of_device *op)
        SET_NETDEV_DEV(dev, &op->dev);
 
        dev->watchdog_timeo = 5*HZ;
-       dev->irq = op->irqs[0];
+       dev->irq = op->archdata.irqs[0];
        dev->dma = 0;
        dev->ethtool_ops = &qe_ethtool_ops;
        dev->netdev_ops = &qec_ops;
@@ -988,18 +988,18 @@ static struct of_platform_driver qec_sbus_driver = {
 
 static int __init qec_init(void)
 {
-       return of_register_driver(&qec_sbus_driver, &of_bus_type);
+       return of_register_platform_driver(&qec_sbus_driver);
 }
 
 static void __exit qec_exit(void)
 {
-       of_unregister_driver(&qec_sbus_driver);
+       of_unregister_platform_driver(&qec_sbus_driver);
 
        while (root_qec_dev) {
                struct sunqec *next = root_qec_dev->next_module;
                struct of_device *op = root_qec_dev->op;
 
-               free_irq(op->irqs[0], (void *) root_qec_dev);
+               free_irq(op->archdata.irqs[0], (void *) root_qec_dev);
                of_iounmap(&op->resource[0], root_qec_dev->gregs,
                           GLOB_REG_SIZE);
                kfree(root_qec_dev);
index d04c5b262050a9aefef0f48cde2bfa2f700510a7..b2c2f391b29db5e025e94381e8d5f97438ff1fc8 100644 (file)
@@ -20,7 +20,7 @@
 #include <linux/skbuff.h>
 #include <linux/io.h>
 #include <linux/slab.h>
-
+#include <linux/of_address.h>
 #include <linux/of_device.h>
 #include <linux/of_platform.h>
 #include <linux/of_mdio.h>
index 7cecc8fea9bd799ffd37e7361c7636cbe3bd69f1..6acbff389ab66c54e12f80a1831fedc41475de87 100644 (file)
@@ -1,35 +1,61 @@
-config OF_FLATTREE
+config DTC
+       bool
+
+config OF
        bool
+
+menu "Flattened Device Tree and Open Firmware support"
        depends on OF
 
+config PROC_DEVICETREE
+       bool "Support for device tree in /proc"
+       depends on PROC_FS && !SPARC
+       help
+         This option adds a device-tree directory under /proc which contains
+         an image of the device tree that the kernel copies from Open
+         Firmware or other boot firmware. If unsure, say Y here.
+
+config OF_FLATTREE
+       bool
+       select DTC
+
 config OF_DYNAMIC
        def_bool y
-       depends on OF && PPC_OF
+       depends on PPC_OF
+
+config OF_ADDRESS
+       def_bool y
+       depends on !SPARC
+
+config OF_IRQ
+       def_bool y
+       depends on !SPARC
 
 config OF_DEVICE
        def_bool y
-       depends on OF && (SPARC || PPC_OF || MICROBLAZE)
 
 config OF_GPIO
        def_bool y
-       depends on OF && (PPC_OF || MICROBLAZE) && GPIOLIB
+       depends on GPIOLIB && !SPARC
        help
          OpenFirmware GPIO accessors
 
 config OF_I2C
        def_tristate I2C
-       depends on (PPC_OF || MICROBLAZE) && I2C
+       depends on I2C && !SPARC
        help
          OpenFirmware I2C accessors
 
 config OF_SPI
        def_tristate SPI
-       depends on OF && (PPC_OF || MICROBLAZE) && SPI
+       depends on SPI && !SPARC
        help
          OpenFirmware SPI accessors
 
 config OF_MDIO
        def_tristate PHYLIB
-       depends on OF && PHYLIB
+       depends on PHYLIB
        help
          OpenFirmware MDIO bus (Ethernet PHY) accessors
+
+endmenu # OF
index f232cc98ce00904e9b655c0fd51b6dd5fa3028d4..0052c405463acfe1d692aaf4dadf22dc455fc771 100644 (file)
@@ -1,5 +1,7 @@
 obj-y = base.o
 obj-$(CONFIG_OF_FLATTREE) += fdt.o
+obj-$(CONFIG_OF_ADDRESS)  += address.o
+obj-$(CONFIG_OF_IRQ)    += irq.o
 obj-$(CONFIG_OF_DEVICE) += device.o platform.o
 obj-$(CONFIG_OF_GPIO)   += gpio.o
 obj-$(CONFIG_OF_I2C)   += of_i2c.o
diff --git a/drivers/of/address.c b/drivers/of/address.c
new file mode 100644 (file)
index 0000000..fcadb72
--- /dev/null
@@ -0,0 +1,595 @@
+
+#include <linux/io.h>
+#include <linux/ioport.h>
+#include <linux/module.h>
+#include <linux/of_address.h>
+#include <linux/pci_regs.h>
+#include <linux/string.h>
+
+/* Max address size we deal with */
+#define OF_MAX_ADDR_CELLS      4
+#define OF_CHECK_COUNTS(na, ns)        ((na) > 0 && (na) <= OF_MAX_ADDR_CELLS && \
+                       (ns) > 0)
+
+static struct of_bus *of_match_bus(struct device_node *np);
+static int __of_address_to_resource(struct device_node *dev, const u32 *addrp,
+                                   u64 size, unsigned int flags,
+                                   struct resource *r);
+
+/* Debug utility */
+#ifdef DEBUG
+static void of_dump_addr(const char *s, const u32 *addr, int na)
+{
+       printk(KERN_DEBUG "%s", s);
+       while (na--)
+               printk(" %08x", be32_to_cpu(*(addr++)));
+       printk("\n");
+}
+#else
+static void of_dump_addr(const char *s, const u32 *addr, int na) { }
+#endif
+
+/* Callbacks for bus specific translators */
+struct of_bus {
+       const char      *name;
+       const char      *addresses;
+       int             (*match)(struct device_node *parent);
+       void            (*count_cells)(struct device_node *child,
+                                      int *addrc, int *sizec);
+       u64             (*map)(u32 *addr, const u32 *range,
+                               int na, int ns, int pna);
+       int             (*translate)(u32 *addr, u64 offset, int na);
+       unsigned int    (*get_flags)(const u32 *addr);
+};
+
+/*
+ * Default translator (generic bus)
+ */
+
+static void of_bus_default_count_cells(struct device_node *dev,
+                                      int *addrc, int *sizec)
+{
+       if (addrc)
+               *addrc = of_n_addr_cells(dev);
+       if (sizec)
+               *sizec = of_n_size_cells(dev);
+}
+
+static u64 of_bus_default_map(u32 *addr, const u32 *range,
+               int na, int ns, int pna)
+{
+       u64 cp, s, da;
+
+       cp = of_read_number(range, na);
+       s  = of_read_number(range + na + pna, ns);
+       da = of_read_number(addr, na);
+
+       pr_debug("OF: default map, cp=%llx, s=%llx, da=%llx\n",
+                (unsigned long long)cp, (unsigned long long)s,
+                (unsigned long long)da);
+
+       if (da < cp || da >= (cp + s))
+               return OF_BAD_ADDR;
+       return da - cp;
+}
+
+static int of_bus_default_translate(u32 *addr, u64 offset, int na)
+{
+       u64 a = of_read_number(addr, na);
+       memset(addr, 0, na * 4);
+       a += offset;
+       if (na > 1)
+               addr[na - 2] = cpu_to_be32(a >> 32);
+       addr[na - 1] = cpu_to_be32(a & 0xffffffffu);
+
+       return 0;
+}
+
+static unsigned int of_bus_default_get_flags(const u32 *addr)
+{
+       return IORESOURCE_MEM;
+}
+
+#ifdef CONFIG_PCI
+/*
+ * PCI bus specific translator
+ */
+
+static int of_bus_pci_match(struct device_node *np)
+{
+       /* "vci" is for the /chaos bridge on 1st-gen PCI powermacs */
+       return !strcmp(np->type, "pci") || !strcmp(np->type, "vci");
+}
+
+static void of_bus_pci_count_cells(struct device_node *np,
+                                  int *addrc, int *sizec)
+{
+       if (addrc)
+               *addrc = 3;
+       if (sizec)
+               *sizec = 2;
+}
+
+static unsigned int of_bus_pci_get_flags(const u32 *addr)
+{
+       unsigned int flags = 0;
+       u32 w = addr[0];
+
+       switch((w >> 24) & 0x03) {
+       case 0x01:
+               flags |= IORESOURCE_IO;
+               break;
+       case 0x02: /* 32 bits */
+       case 0x03: /* 64 bits */
+               flags |= IORESOURCE_MEM;
+               break;
+       }
+       if (w & 0x40000000)
+               flags |= IORESOURCE_PREFETCH;
+       return flags;
+}
+
+static u64 of_bus_pci_map(u32 *addr, const u32 *range, int na, int ns, int pna)
+{
+       u64 cp, s, da;
+       unsigned int af, rf;
+
+       af = of_bus_pci_get_flags(addr);
+       rf = of_bus_pci_get_flags(range);
+
+       /* Check address type match */
+       if ((af ^ rf) & (IORESOURCE_MEM | IORESOURCE_IO))
+               return OF_BAD_ADDR;
+
+       /* Read address values, skipping high cell */
+       cp = of_read_number(range + 1, na - 1);
+       s  = of_read_number(range + na + pna, ns);
+       da = of_read_number(addr + 1, na - 1);
+
+       pr_debug("OF: PCI map, cp=%llx, s=%llx, da=%llx\n",
+                (unsigned long long)cp, (unsigned long long)s,
+                (unsigned long long)da);
+
+       if (da < cp || da >= (cp + s))
+               return OF_BAD_ADDR;
+       return da - cp;
+}
+
+static int of_bus_pci_translate(u32 *addr, u64 offset, int na)
+{
+       return of_bus_default_translate(addr + 1, offset, na - 1);
+}
+
+const u32 *of_get_pci_address(struct device_node *dev, int bar_no, u64 *size,
+                       unsigned int *flags)
+{
+       const u32 *prop;
+       unsigned int psize;
+       struct device_node *parent;
+       struct of_bus *bus;
+       int onesize, i, na, ns;
+
+       /* Get parent & match bus type */
+       parent = of_get_parent(dev);
+       if (parent == NULL)
+               return NULL;
+       bus = of_match_bus(parent);
+       if (strcmp(bus->name, "pci")) {
+               of_node_put(parent);
+               return NULL;
+       }
+       bus->count_cells(dev, &na, &ns);
+       of_node_put(parent);
+       if (!OF_CHECK_COUNTS(na, ns))
+               return NULL;
+
+       /* Get "reg" or "assigned-addresses" property */
+       prop = of_get_property(dev, bus->addresses, &psize);
+       if (prop == NULL)
+               return NULL;
+       psize /= 4;
+
+       onesize = na + ns;
+       for (i = 0; psize >= onesize; psize -= onesize, prop += onesize, i++) {
+               u32 val = be32_to_cpu(prop[0]);
+               if ((val & 0xff) == ((bar_no * 4) + PCI_BASE_ADDRESS_0)) {
+                       if (size)
+                               *size = of_read_number(prop + na, ns);
+                       if (flags)
+                               *flags = bus->get_flags(prop);
+                       return prop;
+               }
+       }
+       return NULL;
+}
+EXPORT_SYMBOL(of_get_pci_address);
+
+int of_pci_address_to_resource(struct device_node *dev, int bar,
+                              struct resource *r)
+{
+       const u32       *addrp;
+       u64             size;
+       unsigned int    flags;
+
+       addrp = of_get_pci_address(dev, bar, &size, &flags);
+       if (addrp == NULL)
+               return -EINVAL;
+       return __of_address_to_resource(dev, addrp, size, flags, r);
+}
+EXPORT_SYMBOL_GPL(of_pci_address_to_resource);
+#endif /* CONFIG_PCI */
+
+/*
+ * ISA bus specific translator
+ */
+
+static int of_bus_isa_match(struct device_node *np)
+{
+       return !strcmp(np->name, "isa");
+}
+
+static void of_bus_isa_count_cells(struct device_node *child,
+                                  int *addrc, int *sizec)
+{
+       if (addrc)
+               *addrc = 2;
+       if (sizec)
+               *sizec = 1;
+}
+
+static u64 of_bus_isa_map(u32 *addr, const u32 *range, int na, int ns, int pna)
+{
+       u64 cp, s, da;
+
+       /* Check address type match */
+       if ((addr[0] ^ range[0]) & 0x00000001)
+               return OF_BAD_ADDR;
+
+       /* Read address values, skipping high cell */
+       cp = of_read_number(range + 1, na - 1);
+       s  = of_read_number(range + na + pna, ns);
+       da = of_read_number(addr + 1, na - 1);
+
+       pr_debug("OF: ISA map, cp=%llx, s=%llx, da=%llx\n",
+                (unsigned long long)cp, (unsigned long long)s,
+                (unsigned long long)da);
+
+       if (da < cp || da >= (cp + s))
+               return OF_BAD_ADDR;
+       return da - cp;
+}
+
+static int of_bus_isa_translate(u32 *addr, u64 offset, int na)
+{
+       return of_bus_default_translate(addr + 1, offset, na - 1);
+}
+
+static unsigned int of_bus_isa_get_flags(const u32 *addr)
+{
+       unsigned int flags = 0;
+       u32 w = addr[0];
+
+       if (w & 1)
+               flags |= IORESOURCE_IO;
+       else
+               flags |= IORESOURCE_MEM;
+       return flags;
+}
+
+/*
+ * Array of bus specific translators
+ */
+
+static struct of_bus of_busses[] = {
+#ifdef CONFIG_PCI
+       /* PCI */
+       {
+               .name = "pci",
+               .addresses = "assigned-addresses",
+               .match = of_bus_pci_match,
+               .count_cells = of_bus_pci_count_cells,
+               .map = of_bus_pci_map,
+               .translate = of_bus_pci_translate,
+               .get_flags = of_bus_pci_get_flags,
+       },
+#endif /* CONFIG_PCI */
+       /* ISA */
+       {
+               .name = "isa",
+               .addresses = "reg",
+               .match = of_bus_isa_match,
+               .count_cells = of_bus_isa_count_cells,
+               .map = of_bus_isa_map,
+               .translate = of_bus_isa_translate,
+               .get_flags = of_bus_isa_get_flags,
+       },
+       /* Default */
+       {
+               .name = "default",
+               .addresses = "reg",
+               .match = NULL,
+               .count_cells = of_bus_default_count_cells,
+               .map = of_bus_default_map,
+               .translate = of_bus_default_translate,
+               .get_flags = of_bus_default_get_flags,
+       },
+};
+
+static struct of_bus *of_match_bus(struct device_node *np)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(of_busses); i++)
+               if (!of_busses[i].match || of_busses[i].match(np))
+                       return &of_busses[i];
+       BUG();
+       return NULL;
+}
+
+static int of_translate_one(struct device_node *parent, struct of_bus *bus,
+                           struct of_bus *pbus, u32 *addr,
+                           int na, int ns, int pna, const char *rprop)
+{
+       const u32 *ranges;
+       unsigned int rlen;
+       int rone;
+       u64 offset = OF_BAD_ADDR;
+
+       /* Normally, an absence of a "ranges" property means we are
+        * crossing a non-translatable boundary, and thus the addresses
+        * below the current not cannot be converted to CPU physical ones.
+        * Unfortunately, while this is very clear in the spec, it's not
+        * what Apple understood, and they do have things like /uni-n or
+        * /ht nodes with no "ranges" property and a lot of perfectly
+        * useable mapped devices below them. Thus we treat the absence of
+        * "ranges" as equivalent to an empty "ranges" property which means
+        * a 1:1 translation at that level. It's up to the caller not to try
+        * to translate addresses that aren't supposed to be translated in
+        * the first place. --BenH.
+        *
+        * As far as we know, this damage only exists on Apple machines, so
+        * This code is only enabled on powerpc. --gcl
+        */
+       ranges = of_get_property(parent, rprop, &rlen);
+#if !defined(CONFIG_PPC)
+       if (ranges == NULL) {
+               pr_err("OF: no ranges; cannot translate\n");
+               return 1;
+       }
+#endif /* !defined(CONFIG_PPC) */
+       if (ranges == NULL || rlen == 0) {
+               offset = of_read_number(addr, na);
+               memset(addr, 0, pna * 4);
+               pr_debug("OF: empty ranges; 1:1 translation\n");
+               goto finish;
+       }
+
+       pr_debug("OF: walking ranges...\n");
+
+       /* Now walk through the ranges */
+       rlen /= 4;
+       rone = na + pna + ns;
+       for (; rlen >= rone; rlen -= rone, ranges += rone) {
+               offset = bus->map(addr, ranges, na, ns, pna);
+               if (offset != OF_BAD_ADDR)
+                       break;
+       }
+       if (offset == OF_BAD_ADDR) {
+               pr_debug("OF: not found !\n");
+               return 1;
+       }
+       memcpy(addr, ranges + na, 4 * pna);
+
+ finish:
+       of_dump_addr("OF: parent translation for:", addr, pna);
+       pr_debug("OF: with offset: %llx\n", (unsigned long long)offset);
+
+       /* Translate it into parent bus space */
+       return pbus->translate(addr, offset, pna);
+}
+
+/*
+ * Translate an address from the device-tree into a CPU physical address,
+ * this walks up the tree and applies the various bus mappings on the
+ * way.
+ *
+ * Note: We consider that crossing any level with #size-cells == 0 to mean
+ * that translation is impossible (that is we are not dealing with a value
+ * that can be mapped to a cpu physical address). This is not really specified
+ * that way, but this is traditionally the way IBM at least do things
+ */
+u64 __of_translate_address(struct device_node *dev, const u32 *in_addr,
+                          const char *rprop)
+{
+       struct device_node *parent = NULL;
+       struct of_bus *bus, *pbus;
+       u32 addr[OF_MAX_ADDR_CELLS];
+       int na, ns, pna, pns;
+       u64 result = OF_BAD_ADDR;
+
+       pr_debug("OF: ** translation for device %s **\n", dev->full_name);
+
+       /* Increase refcount at current level */
+       of_node_get(dev);
+
+       /* Get parent & match bus type */
+       parent = of_get_parent(dev);
+       if (parent == NULL)
+               goto bail;
+       bus = of_match_bus(parent);
+
+       /* Cound address cells & copy address locally */
+       bus->count_cells(dev, &na, &ns);
+       if (!OF_CHECK_COUNTS(na, ns)) {
+               printk(KERN_ERR "prom_parse: Bad cell count for %s\n",
+                      dev->full_name);
+               goto bail;
+       }
+       memcpy(addr, in_addr, na * 4);
+
+       pr_debug("OF: bus is %s (na=%d, ns=%d) on %s\n",
+           bus->name, na, ns, parent->full_name);
+       of_dump_addr("OF: translating address:", addr, na);
+
+       /* Translate */
+       for (;;) {
+               /* Switch to parent bus */
+               of_node_put(dev);
+               dev = parent;
+               parent = of_get_parent(dev);
+
+               /* If root, we have finished */
+               if (parent == NULL) {
+                       pr_debug("OF: reached root node\n");
+                       result = of_read_number(addr, na);
+                       break;
+               }
+
+               /* Get new parent bus and counts */
+               pbus = of_match_bus(parent);
+               pbus->count_cells(dev, &pna, &pns);
+               if (!OF_CHECK_COUNTS(pna, pns)) {
+                       printk(KERN_ERR "prom_parse: Bad cell count for %s\n",
+                              dev->full_name);
+                       break;
+               }
+
+               pr_debug("OF: parent bus is %s (na=%d, ns=%d) on %s\n",
+                   pbus->name, pna, pns, parent->full_name);
+
+               /* Apply bus translation */
+               if (of_translate_one(dev, bus, pbus, addr, na, ns, pna, rprop))
+                       break;
+
+               /* Complete the move up one level */
+               na = pna;
+               ns = pns;
+               bus = pbus;
+
+               of_dump_addr("OF: one level translation:", addr, na);
+       }
+ bail:
+       of_node_put(parent);
+       of_node_put(dev);
+
+       return result;
+}
+
+u64 of_translate_address(struct device_node *dev, const u32 *in_addr)
+{
+       return __of_translate_address(dev, in_addr, "ranges");
+}
+EXPORT_SYMBOL(of_translate_address);
+
+u64 of_translate_dma_address(struct device_node *dev, const u32 *in_addr)
+{
+       return __of_translate_address(dev, in_addr, "dma-ranges");
+}
+EXPORT_SYMBOL(of_translate_dma_address);
+
+const u32 *of_get_address(struct device_node *dev, int index, u64 *size,
+                   unsigned int *flags)
+{
+       const u32 *prop;
+       unsigned int psize;
+       struct device_node *parent;
+       struct of_bus *bus;
+       int onesize, i, na, ns;
+
+       /* Get parent & match bus type */
+       parent = of_get_parent(dev);
+       if (parent == NULL)
+               return NULL;
+       bus = of_match_bus(parent);
+       bus->count_cells(dev, &na, &ns);
+       of_node_put(parent);
+       if (!OF_CHECK_COUNTS(na, ns))
+               return NULL;
+
+       /* Get "reg" or "assigned-addresses" property */
+       prop = of_get_property(dev, bus->addresses, &psize);
+       if (prop == NULL)
+               return NULL;
+       psize /= 4;
+
+       onesize = na + ns;
+       for (i = 0; psize >= onesize; psize -= onesize, prop += onesize, i++)
+               if (i == index) {
+                       if (size)
+                               *size = of_read_number(prop + na, ns);
+                       if (flags)
+                               *flags = bus->get_flags(prop);
+                       return prop;
+               }
+       return NULL;
+}
+EXPORT_SYMBOL(of_get_address);
+
+static int __of_address_to_resource(struct device_node *dev, const u32 *addrp,
+                                   u64 size, unsigned int flags,
+                                   struct resource *r)
+{
+       u64 taddr;
+
+       if ((flags & (IORESOURCE_IO | IORESOURCE_MEM)) == 0)
+               return -EINVAL;
+       taddr = of_translate_address(dev, addrp);
+       if (taddr == OF_BAD_ADDR)
+               return -EINVAL;
+       memset(r, 0, sizeof(struct resource));
+       if (flags & IORESOURCE_IO) {
+               unsigned long port;
+               port = pci_address_to_pio(taddr);
+               if (port == (unsigned long)-1)
+                       return -EINVAL;
+               r->start = port;
+               r->end = port + size - 1;
+       } else {
+               r->start = taddr;
+               r->end = taddr + size - 1;
+       }
+       r->flags = flags;
+       r->name = dev->full_name;
+       return 0;
+}
+
+/**
+ * of_address_to_resource - Translate device tree address and return as resource
+ *
+ * Note that if your address is a PIO address, the conversion will fail if
+ * the physical address can't be internally converted to an IO token with
+ * pci_address_to_pio(), that is because it's either called to early or it
+ * can't be matched to any host bridge IO space
+ */
+int of_address_to_resource(struct device_node *dev, int index,
+                          struct resource *r)
+{
+       const u32       *addrp;
+       u64             size;
+       unsigned int    flags;
+
+       addrp = of_get_address(dev, index, &size, &flags);
+       if (addrp == NULL)
+               return -EINVAL;
+       return __of_address_to_resource(dev, addrp, size, flags, r);
+}
+EXPORT_SYMBOL_GPL(of_address_to_resource);
+
+
+/**
+ * of_iomap - Maps the memory mapped IO for a given device_node
+ * @device:    the device whose io range will be mapped
+ * @index:     index of the io range
+ *
+ * Returns a pointer to the mapped memory
+ */
+void __iomem *of_iomap(struct device_node *np, int index)
+{
+       struct resource res;
+
+       if (of_address_to_resource(np, index, &res))
+               return NULL;
+
+       return ioremap(res.start, 1 + res.end - res.start);
+}
+EXPORT_SYMBOL(of_iomap);
index b5ad9740d8b21a6eb6b3e3f3bd1586e8a5645426..aa805250de765e5e1c9531e0b9cbfbb6143683f2 100644 (file)
@@ -544,75 +544,29 @@ struct device_node *of_find_matching_node(struct device_node *from,
 }
 EXPORT_SYMBOL(of_find_matching_node);
 
-/**
- * of_modalias_table: Table of explicit compatible ==> modalias mappings
- *
- * This table allows particulare compatible property values to be mapped
- * to modalias strings.  This is useful for busses which do not directly
- * understand the OF device tree but are populated based on data contained
- * within the device tree.  SPI and I2C are the two current users of this
- * table.
- *
- * In most cases, devices do not need to be listed in this table because
- * the modalias value can be derived directly from the compatible table.
- * However, if for any reason a value cannot be derived, then this table
- * provides a method to override the implicit derivation.
- *
- * At the moment, a single table is used for all bus types because it is
- * assumed that the data size is small and that the compatible values
- * should already be distinct enough to differentiate between SPI, I2C
- * and other devices.
- */
-struct of_modalias_table {
-       char *of_device;
-       char *modalias;
-};
-static struct of_modalias_table of_modalias_table[] = {
-       { "fsl,mcu-mpc8349emitx", "mcu-mpc8349emitx" },
-       { "mmc-spi-slot", "mmc_spi" },
-};
-
 /**
  * of_modalias_node - Lookup appropriate modalias for a device node
  * @node:      pointer to a device tree node
  * @modalias:  Pointer to buffer that modalias value will be copied into
  * @len:       Length of modalias value
  *
- * Based on the value of the compatible property, this routine will determine
- * an appropriate modalias value for a particular device tree node.  Two
- * separate methods are attempted to derive a modalias value.
+ * Based on the value of the compatible property, this routine will attempt
+ * to choose an appropriate modalias value for a particular device tree node.
+ * It does this by stripping the manufacturer prefix (as delimited by a ',')
+ * from the first entry in the compatible list property.
  *
- * First method is to lookup the compatible value in of_modalias_table.
- * Second is to strip off the manufacturer prefix from the first
- * compatible entry and use the remainder as modalias
- *
- * This routine returns 0 on success
+ * This routine returns 0 on success, <0 on failure.
  */
 int of_modalias_node(struct device_node *node, char *modalias, int len)
 {
-       int i, cplen;
-       const char *compatible;
-       const char *p;
-
-       /* 1. search for exception list entry */
-       for (i = 0; i < ARRAY_SIZE(of_modalias_table); i++) {
-               compatible = of_modalias_table[i].of_device;
-               if (!of_device_is_compatible(node, compatible))
-                       continue;
-               strlcpy(modalias, of_modalias_table[i].modalias, len);
-               return 0;
-       }
+       const char *compatible, *p;
+       int cplen;
 
        compatible = of_get_property(node, "compatible", &cplen);
-       if (!compatible)
+       if (!compatible || strlen(compatible) > cplen)
                return -ENODEV;
-
-       /* 2. take first compatible entry and strip manufacturer */
        p = strchr(compatible, ',');
-       if (!p)
-               return -ENODEV;
-       p++;
-       strlcpy(modalias, p, len);
+       strlcpy(modalias, p ? p + 1 : compatible, len);
        return 0;
 }
 EXPORT_SYMBOL_GPL(of_modalias_node);
@@ -651,14 +605,14 @@ EXPORT_SYMBOL(of_find_node_by_phandle);
 struct device_node *
 of_parse_phandle(struct device_node *np, const char *phandle_name, int index)
 {
-       const phandle *phandle;
+       const __be32 *phandle;
        int size;
 
        phandle = of_get_property(np, phandle_name, &size);
        if ((!phandle) || (size < sizeof(*phandle) * (index + 1)))
                return NULL;
 
-       return of_find_node_by_phandle(phandle[index]);
+       return of_find_node_by_phandle(be32_to_cpup(phandle + index));
 }
 EXPORT_SYMBOL(of_parse_phandle);
 
@@ -714,16 +668,16 @@ int of_parse_phandles_with_args(struct device_node *np, const char *list_name,
 
        while (list < list_end) {
                const __be32 *cells;
-               const phandle *phandle;
+               phandle phandle;
 
-               phandle = list++;
+               phandle = be32_to_cpup(list++);
                args = list;
 
                /* one cell hole in the list = <>; */
-               if (!*phandle)
+               if (!phandle)
                        goto next;
 
-               node = of_find_node_by_phandle(*phandle);
+               node = of_find_node_by_phandle(phandle);
                if (!node) {
                        pr_debug("%s: could not find phandle\n",
                                 np->full_name);
index 7d18f8e0b013199c2e1bfd886b8dd6b93c639f7e..0d8a0644f54018810129479244c975be57f2c34c 100644 (file)
 const struct of_device_id *of_match_device(const struct of_device_id *matches,
                                           const struct device *dev)
 {
-       if (!dev->of_node)
+       if ((!matches) || (!dev->of_node))
                return NULL;
        return of_match_node(matches, dev->of_node);
 }
 EXPORT_SYMBOL(of_match_device);
 
-struct of_device *of_dev_get(struct of_device *dev)
+struct platform_device *of_dev_get(struct platform_device *dev)
 {
        struct device *tmp;
 
@@ -34,13 +34,13 @@ struct of_device *of_dev_get(struct of_device *dev)
                return NULL;
        tmp = get_device(&dev->dev);
        if (tmp)
-               return to_of_device(tmp);
+               return to_platform_device(tmp);
        else
                return NULL;
 }
 EXPORT_SYMBOL(of_dev_get);
 
-void of_dev_put(struct of_device *dev)
+void of_dev_put(struct platform_device *dev)
 {
        if (dev)
                put_device(&dev->dev);
@@ -50,28 +50,25 @@ EXPORT_SYMBOL(of_dev_put);
 static ssize_t devspec_show(struct device *dev,
                                struct device_attribute *attr, char *buf)
 {
-       struct of_device *ofdev;
+       struct platform_device *ofdev;
 
-       ofdev = to_of_device(dev);
+       ofdev = to_platform_device(dev);
        return sprintf(buf, "%s\n", ofdev->dev.of_node->full_name);
 }
 
 static ssize_t name_show(struct device *dev,
                                struct device_attribute *attr, char *buf)
 {
-       struct of_device *ofdev;
+       struct platform_device *ofdev;
 
-       ofdev = to_of_device(dev);
+       ofdev = to_platform_device(dev);
        return sprintf(buf, "%s\n", ofdev->dev.of_node->name);
 }
 
 static ssize_t modalias_show(struct device *dev,
                                struct device_attribute *attr, char *buf)
 {
-       struct of_device *ofdev = to_of_device(dev);
-       ssize_t len = 0;
-
-       len = of_device_get_modalias(ofdev, buf, PAGE_SIZE - 2);
+       ssize_t len = of_device_get_modalias(dev, buf, PAGE_SIZE - 2);
        buf[len] = '\n';
        buf[len+1] = 0;
        return len+1;
@@ -93,20 +90,25 @@ struct device_attribute of_platform_device_attrs[] = {
  */
 void of_release_dev(struct device *dev)
 {
-       struct of_device *ofdev;
+       struct platform_device *ofdev;
 
-       ofdev = to_of_device(dev);
+       ofdev = to_platform_device(dev);
        of_node_put(ofdev->dev.of_node);
        kfree(ofdev);
 }
 EXPORT_SYMBOL(of_release_dev);
 
-int of_device_register(struct of_device *ofdev)
+int of_device_register(struct platform_device *ofdev)
 {
        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
+        * confused on matching */
+       ofdev->name = dev_name(&ofdev->dev);
+       ofdev->id = -1;
+
        /* device_add will assume that this device is on the same node as
         * the parent. If there is no parent defined, set the node
         * explicitly */
@@ -117,25 +119,24 @@ int of_device_register(struct of_device *ofdev)
 }
 EXPORT_SYMBOL(of_device_register);
 
-void of_device_unregister(struct of_device *ofdev)
+void of_device_unregister(struct platform_device *ofdev)
 {
        device_unregister(&ofdev->dev);
 }
 EXPORT_SYMBOL(of_device_unregister);
 
-ssize_t of_device_get_modalias(struct of_device *ofdev,
-                               char *str, ssize_t len)
+ssize_t of_device_get_modalias(struct device *dev, char *str, ssize_t len)
 {
        const char *compat;
        int cplen, i;
        ssize_t tsize, csize, repend;
 
        /* Name & Type */
-       csize = snprintf(str, len, "of:N%sT%s", ofdev->dev.of_node->name,
-                        ofdev->dev.of_node->type);
+       csize = snprintf(str, len, "of:N%sT%s", dev->of_node->name,
+                        dev->of_node->type);
 
        /* Get compatible property if any */
-       compat = of_get_property(ofdev->dev.of_node, "compatible", &cplen);
+       compat = of_get_property(dev->of_node, "compatible", &cplen);
        if (!compat)
                return csize;
 
@@ -170,3 +171,51 @@ ssize_t of_device_get_modalias(struct of_device *ofdev,
 
        return tsize;
 }
+
+/**
+ * of_device_uevent - Display OF related uevent information
+ */
+int of_device_uevent(struct device *dev, struct kobj_uevent_env *env)
+{
+       const char *compat;
+       int seen = 0, cplen, sl;
+
+       if ((!dev) || (!dev->of_node))
+               return -ENODEV;
+
+       if (add_uevent_var(env, "OF_NAME=%s", dev->of_node->name))
+               return -ENOMEM;
+
+       if (add_uevent_var(env, "OF_TYPE=%s", dev->of_node->type))
+               return -ENOMEM;
+
+       /* Since the compatible field can contain pretty much anything
+        * it's not really legal to split it out with commas. We split it
+        * up using a number of environment variables instead. */
+
+       compat = of_get_property(dev->of_node, "compatible", &cplen);
+       while (compat && *compat && cplen > 0) {
+               if (add_uevent_var(env, "OF_COMPATIBLE_%d=%s", seen, compat))
+                       return -ENOMEM;
+
+               sl = strlen(compat) + 1;
+               compat += sl;
+               cplen -= sl;
+               seen++;
+       }
+
+       if (add_uevent_var(env, "OF_COMPATIBLE_N=%d", seen))
+               return -ENOMEM;
+
+       /* modalias is trickier, we add it in 2 steps */
+       if (add_uevent_var(env, "MODALIAS="))
+               return -ENOMEM;
+
+       sl = of_device_get_modalias(dev, &env->buf[env->buflen-1],
+                                   sizeof(env->buf) - env->buflen);
+       if (sl >= (sizeof(env->buf) - env->buflen))
+               return -ENOMEM;
+       env->buflen += sl;
+
+       return 0;
+}
index b6987bba85566d6df8f3afdd8187599cb3618758..65da5aec7552c70162b6646ded99a32c72797b9d 100644 (file)
@@ -69,9 +69,9 @@ int __init of_scan_flat_dt(int (*it)(unsigned long node,
                        u32 sz = be32_to_cpup((__be32 *)p);
                        p += 8;
                        if (be32_to_cpu(initial_boot_params->version) < 0x10)
-                               p = _ALIGN(p, sz >= 8 ? 8 : 4);
+                               p = ALIGN(p, sz >= 8 ? 8 : 4);
                        p += sz;
-                       p = _ALIGN(p, 4);
+                       p = ALIGN(p, 4);
                        continue;
                }
                if (tag != OF_DT_BEGIN_NODE) {
@@ -80,7 +80,7 @@ int __init of_scan_flat_dt(int (*it)(unsigned long node,
                }
                depth++;
                pathp = (char *)p;
-               p = _ALIGN(p + strlen(pathp) + 1, 4);
+               p = ALIGN(p + strlen(pathp) + 1, 4);
                if ((*pathp) == '/') {
                        char *lp, *np;
                        for (lp = NULL, np = pathp; *np; np++)
@@ -109,7 +109,7 @@ unsigned long __init of_get_flat_dt_root(void)
                p += 4;
        BUG_ON(be32_to_cpup((__be32 *)p) != OF_DT_BEGIN_NODE);
        p += 4;
-       return _ALIGN(p + strlen((char *)p) + 1, 4);
+       return ALIGN(p + strlen((char *)p) + 1, 4);
 }
 
 /**
@@ -138,7 +138,7 @@ void *__init of_get_flat_dt_prop(unsigned long node, const char *name,
                noff = be32_to_cpup((__be32 *)(p + 4));
                p += 8;
                if (be32_to_cpu(initial_boot_params->version) < 0x10)
-                       p = _ALIGN(p, sz >= 8 ? 8 : 4);
+                       p = ALIGN(p, sz >= 8 ? 8 : 4);
 
                nstr = find_flat_dt_string(noff);
                if (nstr == NULL) {
@@ -151,7 +151,7 @@ void *__init of_get_flat_dt_prop(unsigned long node, const char *name,
                        return (void *)p;
                }
                p += sz;
-               p = _ALIGN(p, 4);
+               p = ALIGN(p, 4);
        } while (1);
 }
 
@@ -169,7 +169,7 @@ int __init of_flat_dt_is_compatible(unsigned long node, const char *compat)
        if (cp == NULL)
                return 0;
        while (cplen > 0) {
-               if (strncasecmp(cp, compat, strlen(compat)) == 0)
+               if (of_compat_cmp(cp, compat, strlen(compat)) == 0)
                        return 1;
                l = strlen(cp) + 1;
                cp += l;
@@ -184,7 +184,7 @@ static void *__init unflatten_dt_alloc(unsigned long *mem, unsigned long size,
 {
        void *res;
 
-       *mem = _ALIGN(*mem, align);
+       *mem = ALIGN(*mem, align);
        res = (void *)*mem;
        *mem += size;
 
@@ -220,7 +220,7 @@ unsigned long __init unflatten_dt_node(unsigned long mem,
        *p += 4;
        pathp = (char *)*p;
        l = allocl = strlen(pathp) + 1;
-       *p = _ALIGN(*p + l, 4);
+       *p = ALIGN(*p + l, 4);
 
        /* version 0x10 has a more compact unit name here instead of the full
         * path. we accumulate the full path size using "fpsize", we'll rebuild
@@ -299,7 +299,7 @@ unsigned long __init unflatten_dt_node(unsigned long mem,
                noff = be32_to_cpup((__be32 *)((*p) + 4));
                *p += 8;
                if (be32_to_cpu(initial_boot_params->version) < 0x10)
-                       *p = _ALIGN(*p, sz >= 8 ? 8 : 4);
+                       *p = ALIGN(*p, sz >= 8 ? 8 : 4);
 
                pname = find_flat_dt_string(noff);
                if (pname == NULL) {
@@ -320,20 +320,20 @@ unsigned long __init unflatten_dt_node(unsigned long mem,
                        if ((strcmp(pname, "phandle") == 0) ||
                            (strcmp(pname, "linux,phandle") == 0)) {
                                if (np->phandle == 0)
-                                       np->phandle = *((u32 *)*p);
+                                       np->phandle = be32_to_cpup((__be32*)*p);
                        }
                        /* And we process the "ibm,phandle" property
                         * used in pSeries dynamic device tree
                         * stuff */
                        if (strcmp(pname, "ibm,phandle") == 0)
-                               np->phandle = *((u32 *)*p);
+                               np->phandle = be32_to_cpup((__be32 *)*p);
                        pp->name = pname;
                        pp->length = sz;
                        pp->value = (void *)*p;
                        *prev_pp = pp;
                        prev_pp = &pp->next;
                }
-               *p = _ALIGN((*p) + sz, 4);
+               *p = ALIGN((*p) + sz, 4);
        }
        /* with version 0x10 we may not have the name property, recreate
         * it here from the unit name if absent
index a1b31a4abae4479e647e3e1a5eacd314139fbad1..905960338fb21d905a21153b7e8bcc3832ab691a 100644 (file)
  * (at your option) any later version.
  */
 
-#include <linux/kernel.h>
+#include <linux/device.h>
 #include <linux/errno.h>
+#include <linux/module.h>
 #include <linux/io.h>
 #include <linux/of.h>
-#include <linux/slab.h>
+#include <linux/of_address.h>
 #include <linux/of_gpio.h>
-#include <asm/prom.h>
+#include <linux/slab.h>
 
 /**
  * of_get_gpio_flags - Get a GPIO number and flags to use with GPIO API
@@ -33,32 +34,32 @@ int of_get_gpio_flags(struct device_node *np, int index,
                      enum of_gpio_flags *flags)
 {
        int ret;
-       struct device_node *gc;
-       struct of_gpio_chip *of_gc = NULL;
+       struct device_node *gpio_np;
+       struct gpio_chip *gc;
        int size;
        const void *gpio_spec;
        const __be32 *gpio_cells;
 
        ret = of_parse_phandles_with_args(np, "gpios", "#gpio-cells", index,
-                                         &gc, &gpio_spec);
+                                         &gpio_np, &gpio_spec);
        if (ret) {
                pr_debug("%s: can't parse gpios property\n", __func__);
                goto err0;
        }
 
-       of_gc = gc->data;
-       if (!of_gc) {
+       gc = of_node_to_gpiochip(gpio_np);
+       if (!gc) {
                pr_debug("%s: gpio controller %s isn't registered\n",
-                        np->full_name, gc->full_name);
+                        np->full_name, gpio_np->full_name);
                ret = -ENODEV;
                goto err1;
        }
 
-       gpio_cells = of_get_property(gc, "#gpio-cells", &size);
+       gpio_cells = of_get_property(gpio_np, "#gpio-cells", &size);
        if (!gpio_cells || size != sizeof(*gpio_cells) ||
-                       be32_to_cpup(gpio_cells) != of_gc->gpio_cells) {
+                       be32_to_cpup(gpio_cells) != gc->of_gpio_n_cells) {
                pr_debug("%s: wrong #gpio-cells for %s\n",
-                        np->full_name, gc->full_name);
+                        np->full_name, gpio_np->full_name);
                ret = -EINVAL;
                goto err1;
        }
@@ -67,13 +68,13 @@ int of_get_gpio_flags(struct device_node *np, int index,
        if (flags)
                *flags = 0;
 
-       ret = of_gc->xlate(of_gc, np, gpio_spec, flags);
+       ret = gc->of_xlate(gc, np, gpio_spec, flags);
        if (ret < 0)
                goto err1;
 
-       ret += of_gc->gc.base;
+       ret += gc->base;
 err1:
-       of_node_put(gc);
+       of_node_put(gpio_np);
 err0:
        pr_debug("%s exited with status %d\n", __func__, ret);
        return ret;
@@ -116,7 +117,7 @@ EXPORT_SYMBOL(of_gpio_count);
 
 /**
  * of_gpio_simple_xlate - translate gpio_spec to the GPIO number and flags
- * @of_gc:     pointer to the of_gpio_chip structure
+ * @gc:                pointer to the gpio_chip structure
  * @np:                device node of the GPIO chip
  * @gpio_spec: gpio specifier as found in the device tree
  * @flags:     a flags pointer to fill in
@@ -125,8 +126,8 @@ EXPORT_SYMBOL(of_gpio_count);
  * gpio chips. This function performs only one sanity check: whether gpio
  * is less than ngpios (that is specified in the gpio_chip).
  */
-int of_gpio_simple_xlate(struct of_gpio_chip *of_gc, struct device_node *np,
-                        const void *gpio_spec, enum of_gpio_flags *flags)
+static int of_gpio_simple_xlate(struct gpio_chip *gc, struct device_node *np,
+                               const void *gpio_spec, u32 *flags)
 {
        const __be32 *gpio = gpio_spec;
        const u32 n = be32_to_cpup(gpio);
@@ -137,12 +138,12 @@ int of_gpio_simple_xlate(struct of_gpio_chip *of_gc, struct device_node *np,
         * number and the flags from a single gpio cell -- this is possible,
         * but not recommended).
         */
-       if (of_gc->gpio_cells < 2) {
+       if (gc->of_gpio_n_cells < 2) {
                WARN_ON(1);
                return -EINVAL;
        }
 
-       if (n > of_gc->gc.ngpio)
+       if (n > gc->ngpio)
                return -EINVAL;
 
        if (flags)
@@ -150,7 +151,6 @@ int of_gpio_simple_xlate(struct of_gpio_chip *of_gc, struct device_node *np,
 
        return n;
 }
-EXPORT_SYMBOL(of_gpio_simple_xlate);
 
 /**
  * of_mm_gpiochip_add - Add memory mapped GPIO chip (bank)
@@ -161,10 +161,8 @@ EXPORT_SYMBOL(of_gpio_simple_xlate);
  *
  * 1) In the gpio_chip structure:
  *    - all the callbacks
- *
- * 2) In the of_gpio_chip structure:
- *    - gpio_cells
- *    - xlate callback (optional)
+ *    - of_gpio_n_cells
+ *    - of_xlate callback (optional)
  *
  * 3) In the of_mm_gpio_chip structure:
  *    - save_regs callback (optional)
@@ -177,8 +175,7 @@ int of_mm_gpiochip_add(struct device_node *np,
                       struct of_mm_gpio_chip *mm_gc)
 {
        int ret = -ENOMEM;
-       struct of_gpio_chip *of_gc = &mm_gc->of_gc;
-       struct gpio_chip *gc = &of_gc->gc;
+       struct gpio_chip *gc = &mm_gc->gc;
 
        gc->label = kstrdup(np->full_name, GFP_KERNEL);
        if (!gc->label)
@@ -190,26 +187,19 @@ int of_mm_gpiochip_add(struct device_node *np,
 
        gc->base = -1;
 
-       if (!of_gc->xlate)
-               of_gc->xlate = of_gpio_simple_xlate;
-
        if (mm_gc->save_regs)
                mm_gc->save_regs(mm_gc);
 
-       np->data = of_gc;
+       mm_gc->gc.of_node = np;
 
        ret = gpiochip_add(gc);
        if (ret)
                goto err2;
 
-       /* We don't want to lose the node and its ->data */
-       of_node_get(np);
-
        pr_debug("%s: registered as generic GPIO chip, base is %d\n",
                 np->full_name, gc->base);
        return 0;
 err2:
-       np->data = NULL;
        iounmap(mm_gc->regs);
 err1:
        kfree(gc->label);
@@ -219,3 +209,36 @@ err0:
        return ret;
 }
 EXPORT_SYMBOL(of_mm_gpiochip_add);
+
+void of_gpiochip_add(struct gpio_chip *chip)
+{
+       if ((!chip->of_node) && (chip->dev))
+               chip->of_node = chip->dev->of_node;
+
+       if (!chip->of_node)
+               return;
+
+       if (!chip->of_xlate) {
+               chip->of_gpio_n_cells = 2;
+               chip->of_xlate = of_gpio_simple_xlate;
+       }
+
+       of_node_get(chip->of_node);
+}
+
+void of_gpiochip_remove(struct gpio_chip *chip)
+{
+       if (chip->of_node)
+               of_node_put(chip->of_node);
+}
+
+/* Private function for resolving node pointer to gpio_chip */
+static int of_gpiochip_is_match(struct gpio_chip *chip, void *data)
+{
+       return chip->of_node == data;
+}
+
+struct gpio_chip *of_node_to_gpiochip(struct device_node *np)
+{
+       return gpiochip_find(np, of_gpiochip_is_match);
+}
diff --git a/drivers/of/irq.c b/drivers/of/irq.c
new file mode 100644 (file)
index 0000000..6e595e5
--- /dev/null
@@ -0,0 +1,349 @@
+/*
+ *  Derived from arch/i386/kernel/irq.c
+ *    Copyright (C) 1992 Linus Torvalds
+ *  Adapted from arch/i386 by Gary Thomas
+ *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
+ *  Updated and modified by Cort Dougan <cort@fsmlabs.com>
+ *    Copyright (C) 1996-2001 Cort Dougan
+ *  Adapted for Power Macintosh by Paul Mackerras
+ *    Copyright (C) 1996 Paul Mackerras (paulus@cs.anu.edu.au)
+ *
+ * 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.
+ *
+ * This file contains the code used to make IRQ descriptions in the
+ * device tree to actual irq numbers on an interrupt controller
+ * driver.
+ */
+
+#include <linux/errno.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_irq.h>
+#include <linux/string.h>
+
+/**
+ * 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
+ * @index: Index of the interrupt to map
+ *
+ * This function is a wrapper that chains of_irq_map_one() and
+ * irq_create_of_mapping() to make things easier to callers
+ */
+unsigned int irq_of_parse_and_map(struct device_node *dev, int index)
+{
+       struct of_irq oirq;
+
+       if (of_irq_map_one(dev, index, &oirq))
+               return NO_IRQ;
+
+       return irq_create_of_mapping(oirq.controller, oirq.specifier,
+                                    oirq.size);
+}
+EXPORT_SYMBOL_GPL(irq_of_parse_and_map);
+
+/**
+ * of_irq_find_parent - Given a device node, find its interrupt parent node
+ * @child: pointer to device node
+ *
+ * Returns a pointer to the interrupt parent node, or NULL if the interrupt
+ * parent could not be determined.
+ */
+static struct device_node *of_irq_find_parent(struct device_node *child)
+{
+       struct device_node *p;
+       const __be32 *parp;
+
+       if (!of_node_get(child))
+               return NULL;
+
+       do {
+               parp = of_get_property(child, "interrupt-parent", NULL);
+               if (parp == NULL)
+                       p = of_get_parent(child);
+               else {
+                       if (of_irq_workarounds & OF_IMAP_NO_PHANDLE)
+                               p = of_node_get(of_irq_dflt_pic);
+                       else
+                               p = of_find_node_by_phandle(be32_to_cpup(parp));
+               }
+               of_node_put(child);
+               child = p;
+       } while (p && of_get_property(p, "#interrupt-cells", NULL) == NULL);
+
+       return p;
+}
+
+/**
+ * of_irq_map_raw - Low level interrupt tree parsing
+ * @parent:    the device interrupt parent
+ * @intspec:   interrupt specifier ("interrupts" property of the device)
+ * @ointsize:   size of the passed in interrupt specifier
+ * @addr:      address specifier (start of "reg" property of the device)
+ * @out_irq:   structure of_irq filled by this function
+ *
+ * Returns 0 on success and a negative number on error
+ *
+ * This function is a low-level interrupt tree walking function. It
+ * can be used to do a partial walk with synthetized reg and interrupts
+ * properties, for example when resolving PCI interrupts when no device
+ * node exist for the parent.
+ */
+int of_irq_map_raw(struct device_node *parent, const __be32 *intspec,
+                  u32 ointsize, const __be32 *addr, struct of_irq *out_irq)
+{
+       struct device_node *ipar, *tnode, *old = NULL, *newpar = NULL;
+       const __be32 *tmp, *imap, *imask;
+       u32 intsize = 1, addrsize, newintsize = 0, newaddrsize = 0;
+       int imaplen, match, i;
+
+       pr_debug("of_irq_map_raw: par=%s,intspec=[0x%08x 0x%08x...],ointsize=%d\n",
+                parent->full_name, be32_to_cpup(intspec),
+                be32_to_cpup(intspec + 1), ointsize);
+
+       ipar = of_node_get(parent);
+
+       /* First get the #interrupt-cells property of the current cursor
+        * that tells us how to interpret the passed-in intspec. If there
+        * is none, we are nice and just walk up the tree
+        */
+       do {
+               tmp = of_get_property(ipar, "#interrupt-cells", NULL);
+               if (tmp != NULL) {
+                       intsize = be32_to_cpu(*tmp);
+                       break;
+               }
+               tnode = ipar;
+               ipar = of_irq_find_parent(ipar);
+               of_node_put(tnode);
+       } while (ipar);
+       if (ipar == NULL) {
+               pr_debug(" -> no parent found !\n");
+               goto fail;
+       }
+
+       pr_debug("of_irq_map_raw: ipar=%s, size=%d\n", ipar->full_name, intsize);
+
+       if (ointsize != intsize)
+               return -EINVAL;
+
+       /* Look for this #address-cells. We have to implement the old linux
+        * trick of looking for the parent here as some device-trees rely on it
+        */
+       old = of_node_get(ipar);
+       do {
+               tmp = of_get_property(old, "#address-cells", NULL);
+               tnode = of_get_parent(old);
+               of_node_put(old);
+               old = tnode;
+       } while (old && tmp == NULL);
+       of_node_put(old);
+       old = NULL;
+       addrsize = (tmp == NULL) ? 2 : be32_to_cpu(*tmp);
+
+       pr_debug(" -> addrsize=%d\n", addrsize);
+
+       /* Now start the actual "proper" walk of the interrupt tree */
+       while (ipar != NULL) {
+               /* Now check if cursor is an interrupt-controller and if it is
+                * then we are done
+                */
+               if (of_get_property(ipar, "interrupt-controller", NULL) !=
+                               NULL) {
+                       pr_debug(" -> got it !\n");
+                       for (i = 0; i < intsize; i++)
+                               out_irq->specifier[i] =
+                                               of_read_number(intspec +i, 1);
+                       out_irq->size = intsize;
+                       out_irq->controller = ipar;
+                       of_node_put(old);
+                       return 0;
+               }
+
+               /* Now look for an interrupt-map */
+               imap = of_get_property(ipar, "interrupt-map", &imaplen);
+               /* No interrupt map, check for an interrupt parent */
+               if (imap == NULL) {
+                       pr_debug(" -> no map, getting parent\n");
+                       newpar = of_irq_find_parent(ipar);
+                       goto skiplevel;
+               }
+               imaplen /= sizeof(u32);
+
+               /* Look for a mask */
+               imask = of_get_property(ipar, "interrupt-map-mask", NULL);
+
+               /* If we were passed no "reg" property and we attempt to parse
+                * an interrupt-map, then #address-cells must be 0.
+                * Fail if it's not.
+                */
+               if (addr == NULL && addrsize != 0) {
+                       pr_debug(" -> no reg passed in when needed !\n");
+                       goto fail;
+               }
+
+               /* Parse interrupt-map */
+               match = 0;
+               while (imaplen > (addrsize + intsize + 1) && !match) {
+                       /* Compare specifiers */
+                       match = 1;
+                       for (i = 0; i < addrsize && match; ++i) {
+                               u32 mask = imask ? imask[i] : 0xffffffffu;
+                               match = ((addr[i] ^ imap[i]) & mask) == 0;
+                       }
+                       for (; i < (addrsize + intsize) && match; ++i) {
+                               u32 mask = imask ? imask[i] : 0xffffffffu;
+                               match =
+                                  ((intspec[i-addrsize] ^ imap[i]) & mask) == 0;
+                       }
+                       imap += addrsize + intsize;
+                       imaplen -= addrsize + intsize;
+
+                       pr_debug(" -> match=%d (imaplen=%d)\n", match, imaplen);
+
+                       /* Get the interrupt parent */
+                       if (of_irq_workarounds & OF_IMAP_NO_PHANDLE)
+                               newpar = of_node_get(of_irq_dflt_pic);
+                       else
+                               newpar = of_find_node_by_phandle(be32_to_cpup(imap));
+                       imap++;
+                       --imaplen;
+
+                       /* Check if not found */
+                       if (newpar == NULL) {
+                               pr_debug(" -> imap parent not found !\n");
+                               goto fail;
+                       }
+
+                       /* Get #interrupt-cells and #address-cells of new
+                        * parent
+                        */
+                       tmp = of_get_property(newpar, "#interrupt-cells", NULL);
+                       if (tmp == NULL) {
+                               pr_debug(" -> parent lacks #interrupt-cells!\n");
+                               goto fail;
+                       }
+                       newintsize = be32_to_cpu(*tmp);
+                       tmp = of_get_property(newpar, "#address-cells", NULL);
+                       newaddrsize = (tmp == NULL) ? 0 : be32_to_cpu(*tmp);
+
+                       pr_debug(" -> newintsize=%d, newaddrsize=%d\n",
+                           newintsize, newaddrsize);
+
+                       /* Check for malformed properties */
+                       if (imaplen < (newaddrsize + newintsize))
+                               goto fail;
+
+                       imap += newaddrsize + newintsize;
+                       imaplen -= newaddrsize + newintsize;
+
+                       pr_debug(" -> imaplen=%d\n", imaplen);
+               }
+               if (!match)
+                       goto fail;
+
+               of_node_put(old);
+               old = of_node_get(newpar);
+               addrsize = newaddrsize;
+               intsize = newintsize;
+               intspec = imap - intsize;
+               addr = intspec - addrsize;
+
+       skiplevel:
+               /* Iterate again with new parent */
+               pr_debug(" -> new parent: %s\n", newpar ? newpar->full_name : "<>");
+               of_node_put(ipar);
+               ipar = newpar;
+               newpar = NULL;
+       }
+ fail:
+       of_node_put(ipar);
+       of_node_put(old);
+       of_node_put(newpar);
+
+       return -EINVAL;
+}
+EXPORT_SYMBOL_GPL(of_irq_map_raw);
+
+/**
+ * of_irq_map_one - Resolve an interrupt for a device
+ * @device: the device whose interrupt is to be resolved
+ * @index: index of the interrupt to resolve
+ * @out_irq: structure of_irq filled by this function
+ *
+ * This function resolves an interrupt, walking the tree, for a given
+ * device-tree node. It's the high level pendant to of_irq_map_raw().
+ */
+int of_irq_map_one(struct device_node *device, int index, struct of_irq *out_irq)
+{
+       struct device_node *p;
+       const __be32 *intspec, *tmp, *addr;
+       u32 intsize, intlen;
+       int res = -EINVAL;
+
+       pr_debug("of_irq_map_one: dev=%s, index=%d\n", device->full_name, index);
+
+       /* OldWorld mac stuff is "special", handle out of line */
+       if (of_irq_workarounds & OF_IMAP_OLDWORLD_MAC)
+               return of_irq_map_oldworld(device, index, out_irq);
+
+       /* Get the interrupts property */
+       intspec = of_get_property(device, "interrupts", &intlen);
+       if (intspec == NULL)
+               return -EINVAL;
+       intlen /= sizeof(*intspec);
+
+       pr_debug(" intspec=%d intlen=%d\n", be32_to_cpup(intspec), intlen);
+
+       /* Get the reg property (if any) */
+       addr = of_get_property(device, "reg", NULL);
+
+       /* Look for the interrupt parent. */
+       p = of_irq_find_parent(device);
+       if (p == NULL)
+               return -EINVAL;
+
+       /* Get size of interrupt specifier */
+       tmp = of_get_property(p, "#interrupt-cells", NULL);
+       if (tmp == NULL)
+               goto out;
+       intsize = be32_to_cpu(*tmp);
+
+       pr_debug(" intsize=%d intlen=%d\n", intsize, intlen);
+
+       /* Check index */
+       if ((index + 1) * intsize > intlen)
+               goto out;
+
+       /* Get new specifier and map it */
+       res = of_irq_map_raw(p, intspec + index * intsize, intsize,
+                            addr, out_irq);
+ out:
+       of_node_put(p);
+       return res;
+}
+EXPORT_SYMBOL_GPL(of_irq_map_one);
+
+/**
+ * of_irq_to_resource - Decode a node's IRQ and return it as a resource
+ * @dev: pointer to device tree node
+ * @index: zero-based index of the irq
+ * @r: pointer to resource structure to return result into.
+ */
+int of_irq_to_resource(struct device_node *dev, int index, struct resource *r)
+{
+       int irq = irq_of_parse_and_map(dev, index);
+
+       /* Only dereference the resource if both the
+        * resource and the irq are valid. */
+       if (r && irq != NO_IRQ) {
+               r->start = r->end = irq;
+               r->flags = IORESOURCE_IRQ;
+               r->name = dev->full_name;
+       }
+
+       return irq;
+}
+EXPORT_SYMBOL_GPL(of_irq_to_resource);
index ab6522c8e4fe801fc5ae8fefb782fdc0869a77fa..0a694debd226b8dbc066789f198b2de0017c30d8 100644 (file)
 #include <linux/i2c.h>
 #include <linux/of.h>
 #include <linux/of_i2c.h>
+#include <linux/of_irq.h>
 #include <linux/module.h>
 
-void of_register_i2c_devices(struct i2c_adapter *adap,
-                            struct device_node *adap_node)
+void of_i2c_register_devices(struct i2c_adapter *adap)
 {
        void *result;
        struct device_node *node;
 
-       for_each_child_of_node(adap_node, node) {
+       /* Only register child devices if the adapter has a node pointer set */
+       if (!adap->dev.of_node)
+               return;
+
+       dev_dbg(&adap->dev, "of_i2c: walking child nodes\n");
+
+       for_each_child_of_node(adap->dev.of_node, node) {
                struct i2c_board_info info = {};
                struct dev_archdata dev_ad = {};
                const __be32 *addr;
                int len;
 
-               if (of_modalias_node(node, info.type, sizeof(info.type)) < 0)
+               dev_dbg(&adap->dev, "of_i2c: register %s\n", node->full_name);
+
+               if (of_modalias_node(node, info.type, sizeof(info.type)) < 0) {
+                       dev_err(&adap->dev, "of_i2c: modalias failure on %s\n",
+                               node->full_name);
                        continue;
+               }
 
                addr = of_get_property(node, "reg", &len);
-               if (!addr || len < sizeof(int) || *addr > (1 << 10) - 1) {
-                       printk(KERN_ERR
-                              "of-i2c: invalid i2c device entry\n");
+               if (!addr || (len < sizeof(int))) {
+                       dev_err(&adap->dev, "of_i2c: invalid reg on %s\n",
+                               node->full_name);
                        continue;
                }
 
-               info.irq = irq_of_parse_and_map(node, 0);
-
                info.addr = be32_to_cpup(addr);
+               if (info.addr > (1 << 10) - 1) {
+                       dev_err(&adap->dev, "of_i2c: invalid addr=%x on %s\n",
+                               info.addr, node->full_name);
+                       continue;
+               }
 
-               info.of_node = node;
+               info.irq = irq_of_parse_and_map(node, 0);
+               info.of_node = of_node_get(node);
                info.archdata = &dev_ad;
 
                request_module("%s", info.type);
 
                result = i2c_new_device(adap, &info);
                if (result == NULL) {
-                       printk(KERN_ERR
-                              "of-i2c: Failed to load driver for %s\n",
-                              info.type);
+                       dev_err(&adap->dev, "of_i2c: Failure registering %s\n",
+                               node->full_name);
+                       of_node_put(node);
                        irq_dispose_mapping(info.irq);
                        continue;
                }
-
-               /*
-                * Get the node to not lose the dev_archdata->of_node.
-                * Currently there is no way to put it back, as well as no
-                * of_unregister_i2c_devices() call.
-                */
-               of_node_get(node);
        }
 }
-EXPORT_SYMBOL(of_register_i2c_devices);
+EXPORT_SYMBOL(of_i2c_register_devices);
 
 static int of_dev_node_match(struct device *dev, void *data)
 {
index 42a6715f8e84287ed2eef40382dc7bc89e181fbf..1fce00eb421bfc68ae531136a240680b66db4635 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/err.h>
 #include <linux/phy.h>
 #include <linux/of.h>
+#include <linux/of_irq.h>
 #include <linux/of_mdio.h>
 #include <linux/module.h>
 
index 5fed7e3c7da341362a1c7bdf08f53b5e4b11c60a..1dbce58a58b01eecc8ebe48d7a9d802cfa90193f 100644 (file)
@@ -9,17 +9,17 @@
 #include <linux/of.h>
 #include <linux/device.h>
 #include <linux/spi/spi.h>
+#include <linux/of_irq.h>
 #include <linux/of_spi.h>
 
 /**
  * of_register_spi_devices - Register child devices onto the SPI bus
  * @master:    Pointer to spi_master device
- * @np:                parent node of SPI device nodes
  *
- * Registers an spi_device for each child node of 'np' which has a 'reg'
+ * Registers an spi_device for each child node of master node which has a 'reg'
  * property.
  */
-void of_register_spi_devices(struct spi_master *master, struct device_node *np)
+void of_register_spi_devices(struct spi_master *master)
 {
        struct spi_device *spi;
        struct device_node *nc;
@@ -27,7 +27,10 @@ void of_register_spi_devices(struct spi_master *master, struct device_node *np)
        int rc;
        int len;
 
-       for_each_child_of_node(np, nc) {
+       if (!master->dev.of_node)
+               return;
+
+       for_each_child_of_node(master->dev.of_node, nc) {
                /* Alloc an spi_device */
                spi = spi_alloc_device(master);
                if (!spi) {
index 7dacc1ebe91e013cadbc77ca57cf729f34585ef5..bb72223c22ae233592b31549bd9417a1d3eb3c65 100644 (file)
 #include <linux/errno.h>
 #include <linux/module.h>
 #include <linux/device.h>
+#include <linux/dma-mapping.h>
+#include <linux/slab.h>
+#include <linux/of_address.h>
 #include <linux/of_device.h>
+#include <linux/of_irq.h>
 #include <linux/of_platform.h>
+#include <linux/platform_device.h>
+
+static int of_dev_node_match(struct device *dev, void *data)
+{
+       return dev->of_node == data;
+}
+
+/**
+ * of_find_device_by_node - Find the platform_device associated with a node
+ * @np: Pointer to device tree node
+ *
+ * Returns platform_device pointer, or NULL if not found
+ */
+struct platform_device *of_find_device_by_node(struct device_node *np)
+{
+       struct device *dev;
+
+       dev = bus_find_device(&platform_bus_type, NULL, np, of_dev_node_match);
+       return dev ? to_platform_device(dev) : NULL;
+}
+EXPORT_SYMBOL(of_find_device_by_node);
+
+static int platform_driver_probe_shim(struct platform_device *pdev)
+{
+       struct platform_driver *pdrv;
+       struct of_platform_driver *ofpdrv;
+       const struct of_device_id *match;
+
+       pdrv = container_of(pdev->dev.driver, struct platform_driver, driver);
+       ofpdrv = container_of(pdrv, struct of_platform_driver, platform_driver);
+
+       /* There is an unlikely chance that an of_platform driver might match
+        * on a non-OF platform device.  If so, then of_match_device() will
+        * come up empty.  Return -EINVAL in this case so other drivers get
+        * the chance to bind. */
+       match = of_match_device(pdev->dev.driver->of_match_table, &pdev->dev);
+       return match ? ofpdrv->probe(pdev, match) : -EINVAL;
+}
+
+static void platform_driver_shutdown_shim(struct platform_device *pdev)
+{
+       struct platform_driver *pdrv;
+       struct of_platform_driver *ofpdrv;
+
+       pdrv = container_of(pdev->dev.driver, struct platform_driver, driver);
+       ofpdrv = container_of(pdrv, struct of_platform_driver, platform_driver);
+       ofpdrv->shutdown(pdev);
+}
+
+/**
+ * of_register_platform_driver
+ */
+int of_register_platform_driver(struct of_platform_driver *drv)
+{
+       char *of_name;
+
+       /* setup of_platform_driver to platform_driver adaptors */
+       drv->platform_driver.driver = drv->driver;
+
+       /* Prefix the driver name with 'of:' to avoid namespace collisions
+        * and bogus matches.  There are some drivers in the tree that
+        * register both an of_platform_driver and a platform_driver with
+        * the same name.  This is a temporary measure until they are all
+        * cleaned up --gcl July 29, 2010 */
+       of_name = kmalloc(strlen(drv->driver.name) + 5, GFP_KERNEL);
+       if (!of_name)
+               return -ENOMEM;
+       sprintf(of_name, "of:%s", drv->driver.name);
+       drv->platform_driver.driver.name = of_name;
+
+       if (drv->probe)
+               drv->platform_driver.probe = platform_driver_probe_shim;
+       drv->platform_driver.remove = drv->remove;
+       if (drv->shutdown)
+               drv->platform_driver.shutdown = platform_driver_shutdown_shim;
+       drv->platform_driver.suspend = drv->suspend;
+       drv->platform_driver.resume = drv->resume;
+
+       return platform_driver_register(&drv->platform_driver);
+}
+EXPORT_SYMBOL(of_register_platform_driver);
+
+void of_unregister_platform_driver(struct of_platform_driver *drv)
+{
+       platform_driver_unregister(&drv->platform_driver);
+       kfree(drv->platform_driver.driver.name);
+       drv->platform_driver.driver.name = NULL;
+}
+EXPORT_SYMBOL(of_unregister_platform_driver);
+
+#if defined(CONFIG_PPC_DCR)
+#include <asm/dcr.h>
+#endif
 
 extern struct device_attribute of_platform_device_attrs[];
 
@@ -33,11 +130,11 @@ static int of_platform_device_probe(struct device *dev)
 {
        int error = -ENODEV;
        struct of_platform_driver *drv;
-       struct of_device *of_dev;
+       struct platform_device *of_dev;
        const struct of_device_id *match;
 
        drv = to_of_platform_driver(dev->driver);
-       of_dev = to_of_device(dev);
+       of_dev = to_platform_device(dev);
 
        if (!drv->probe)
                return error;
@@ -55,7 +152,7 @@ static int of_platform_device_probe(struct device *dev)
 
 static int of_platform_device_remove(struct device *dev)
 {
-       struct of_device *of_dev = to_of_device(dev);
+       struct platform_device *of_dev = to_platform_device(dev);
        struct of_platform_driver *drv = to_of_platform_driver(dev->driver);
 
        if (dev->driver && drv->remove)
@@ -65,7 +162,7 @@ static int of_platform_device_remove(struct device *dev)
 
 static void of_platform_device_shutdown(struct device *dev)
 {
-       struct of_device *of_dev = to_of_device(dev);
+       struct platform_device *of_dev = to_platform_device(dev);
        struct of_platform_driver *drv = to_of_platform_driver(dev->driver);
 
        if (dev->driver && drv->shutdown)
@@ -76,7 +173,7 @@ static void of_platform_device_shutdown(struct device *dev)
 
 static int of_platform_legacy_suspend(struct device *dev, pm_message_t mesg)
 {
-       struct of_device *of_dev = to_of_device(dev);
+       struct platform_device *of_dev = to_platform_device(dev);
        struct of_platform_driver *drv = to_of_platform_driver(dev->driver);
        int ret = 0;
 
@@ -87,7 +184,7 @@ static int of_platform_legacy_suspend(struct device *dev, pm_message_t mesg)
 
 static int of_platform_legacy_resume(struct device *dev)
 {
-       struct of_device *of_dev = to_of_device(dev);
+       struct platform_device *of_dev = to_platform_device(dev);
        struct of_platform_driver *drv = to_of_platform_driver(dev->driver);
        int ret = 0;
 
@@ -384,15 +481,286 @@ int of_bus_type_init(struct bus_type *bus, const char *name)
 
 int of_register_driver(struct of_platform_driver *drv, struct bus_type *bus)
 {
-       drv->driver.bus = bus;
+       /*
+        * Temporary: of_platform_bus used to be distinct from the platform
+        * bus.  It isn't anymore, and so drivers on the platform bus need
+        * to be registered in a special way.
+        *
+        * After all of_platform_bus_type drivers are converted to
+        * platform_drivers, this exception can be removed.
+        */
+       if (bus == &platform_bus_type)
+               return of_register_platform_driver(drv);
 
        /* register with core */
+       drv->driver.bus = bus;
        return driver_register(&drv->driver);
 }
 EXPORT_SYMBOL(of_register_driver);
 
 void of_unregister_driver(struct of_platform_driver *drv)
 {
-       driver_unregister(&drv->driver);
+       if (drv->driver.bus == &platform_bus_type)
+               of_unregister_platform_driver(drv);
+       else
+               driver_unregister(&drv->driver);
 }
 EXPORT_SYMBOL(of_unregister_driver);
+
+#if !defined(CONFIG_SPARC)
+/*
+ * The following routines scan a subtree and registers a device for
+ * each applicable node.
+ *
+ * Note: sparc doesn't use these routines because it has a different
+ * mechanism for creating devices from device tree nodes.
+ */
+
+/**
+ * of_device_make_bus_id - Use the device node data to assign a unique name
+ * @dev: pointer to device structure that is linked to a device tree node
+ *
+ * This routine will first try using either the dcr-reg or the reg property
+ * value to derive a unique name.  As a last resort it will use the node
+ * name followed by a unique number.
+ */
+void of_device_make_bus_id(struct device *dev)
+{
+       static atomic_t bus_no_reg_magic;
+       struct device_node *node = dev->of_node;
+       const u32 *reg;
+       u64 addr;
+       int magic;
+
+#ifdef CONFIG_PPC_DCR
+       /*
+        * If it's a DCR based device, use 'd' for native DCRs
+        * and 'D' for MMIO DCRs.
+        */
+       reg = of_get_property(node, "dcr-reg", NULL);
+       if (reg) {
+#ifdef CONFIG_PPC_DCR_NATIVE
+               dev_set_name(dev, "d%x.%s", *reg, node->name);
+#else /* CONFIG_PPC_DCR_NATIVE */
+               u64 addr = of_translate_dcr_address(node, *reg, NULL);
+               if (addr != OF_BAD_ADDR) {
+                       dev_set_name(dev, "D%llx.%s",
+                                    (unsigned long long)addr, node->name);
+                       return;
+               }
+#endif /* !CONFIG_PPC_DCR_NATIVE */
+       }
+#endif /* CONFIG_PPC_DCR */
+
+       /*
+        * For MMIO, get the physical address
+        */
+       reg = of_get_property(node, "reg", NULL);
+       if (reg) {
+               addr = of_translate_address(node, reg);
+               if (addr != OF_BAD_ADDR) {
+                       dev_set_name(dev, "%llx.%s",
+                                    (unsigned long long)addr, node->name);
+                       return;
+               }
+       }
+
+       /*
+        * No BusID, use the node name and add a globally incremented
+        * counter (and pray...)
+        */
+       magic = atomic_add_return(1, &bus_no_reg_magic);
+       dev_set_name(dev, "%s.%d", node->name, magic - 1);
+}
+
+/**
+ * of_device_alloc - Allocate and initialize an of_device
+ * @np: device node to assign to device
+ * @bus_id: Name to assign to the device.  May be null to use default name.
+ * @parent: Parent device.
+ */
+struct platform_device *of_device_alloc(struct device_node *np,
+                                 const char *bus_id,
+                                 struct device *parent)
+{
+       struct platform_device *dev;
+       int rc, i, num_reg = 0, num_irq = 0;
+       struct resource *res, temp_res;
+
+       /* First count how many resources are needed */
+       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)
+               return NULL;
+       res = (struct resource *) &dev[1];
+
+       /* Populate the resource table */
+       if (num_irq || num_reg) {
+               dev->num_resources = num_reg + num_irq;
+               dev->resource = res;
+               for (i = 0; i < num_reg; i++, res++) {
+                       rc = of_address_to_resource(np, i, res);
+                       WARN_ON(rc);
+               }
+               for (i = 0; i < num_irq; i++, res++) {
+                       rc = of_irq_to_resource(np, i, res);
+                       WARN_ON(rc == NO_IRQ);
+               }
+       }
+
+       dev->dev.of_node = of_node_get(np);
+#if defined(CONFIG_PPC) || defined(CONFIG_MICROBLAZE)
+       dev->dev.dma_mask = &dev->archdata.dma_mask;
+#endif
+       dev->dev.parent = parent;
+       dev->dev.release = of_release_dev;
+
+       if (bus_id)
+               dev_set_name(&dev->dev, "%s", bus_id);
+       else
+               of_device_make_bus_id(&dev->dev);
+
+       return dev;
+}
+EXPORT_SYMBOL(of_device_alloc);
+
+/**
+ * of_platform_device_create - Alloc, initialize and register an of_device
+ * @np: pointer to node to create device for
+ * @bus_id: name to assign device
+ * @parent: Linux device model parent device.
+ */
+struct platform_device *of_platform_device_create(struct device_node *np,
+                                           const char *bus_id,
+                                           struct device *parent)
+{
+       struct platform_device *dev;
+
+       dev = of_device_alloc(np, bus_id, parent);
+       if (!dev)
+               return NULL;
+
+#if defined(CONFIG_PPC) || defined(CONFIG_MICROBLAZE)
+       dev->archdata.dma_mask = 0xffffffffUL;
+#endif
+       dev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
+       dev->dev.bus = &platform_bus_type;
+
+       /* We do not fill the DMA ops for platform devices by default.
+        * This is currently the responsibility of the platform code
+        * to do such, possibly using a device notifier
+        */
+
+       if (of_device_register(dev) != 0) {
+               of_device_free(dev);
+               return NULL;
+       }
+
+       return dev;
+}
+EXPORT_SYMBOL(of_platform_device_create);
+
+/**
+ * of_platform_bus_create - Create an OF device for a bus node and all its
+ * children. Optionally recursively instantiate matching busses.
+ * @bus: device node of the bus to instantiate
+ * @matches: match table, NULL to use the default, OF_NO_DEEP_PROBE to
+ * disallow recursive creation of child busses
+ */
+static int of_platform_bus_create(const struct device_node *bus,
+                                 const struct of_device_id *matches,
+                                 struct device *parent)
+{
+       struct device_node *child;
+       struct platform_device *dev;
+       int rc = 0;
+
+       for_each_child_of_node(bus, child) {
+               pr_debug("   create child: %s\n", child->full_name);
+               dev = of_platform_device_create(child, NULL, parent);
+               if (dev == NULL)
+                       rc = -ENOMEM;
+               else if (!of_match_node(matches, child))
+                       continue;
+               if (rc == 0) {
+                       pr_debug("   and sub busses\n");
+                       rc = of_platform_bus_create(child, matches, &dev->dev);
+               }
+               if (rc) {
+                       of_node_put(child);
+                       break;
+               }
+       }
+       return rc;
+}
+
+/**
+ * of_platform_bus_probe - Probe the device-tree for platform busses
+ * @root: parent of the first level to probe or NULL for the root of the tree
+ * @matches: match table, NULL to use the default
+ * @parent: parent to hook devices from, NULL for toplevel
+ *
+ * Note that children of the provided root are not instantiated as devices
+ * unless the specified root itself matches the bus list and is not NULL.
+ */
+int of_platform_bus_probe(struct device_node *root,
+                         const struct of_device_id *matches,
+                         struct device *parent)
+{
+       struct device_node *child;
+       struct platform_device *dev;
+       int rc = 0;
+
+       if (WARN_ON(!matches || matches == OF_NO_DEEP_PROBE))
+               return -EINVAL;
+       if (root == NULL)
+               root = of_find_node_by_path("/");
+       else
+               of_node_get(root);
+       if (root == NULL)
+               return -EINVAL;
+
+       pr_debug("of_platform_bus_probe()\n");
+       pr_debug(" starting at: %s\n", root->full_name);
+
+       /* Do a self check of bus type, if there's a match, create
+        * children
+        */
+       if (of_match_node(matches, root)) {
+               pr_debug(" root match, create all sub devices\n");
+               dev = of_platform_device_create(root, NULL, parent);
+               if (dev == NULL) {
+                       rc = -ENOMEM;
+                       goto bail;
+               }
+               pr_debug(" create all sub busses\n");
+               rc = of_platform_bus_create(root, matches, &dev->dev);
+               goto bail;
+       }
+       for_each_child_of_node(root, child) {
+               if (!of_match_node(matches, child))
+                       continue;
+
+               pr_debug("  match: %s\n", child->full_name);
+               dev = of_platform_device_create(child, NULL, parent);
+               if (dev == NULL)
+                       rc = -ENOMEM;
+               else
+                       rc = of_platform_bus_create(child, matches, &dev->dev);
+               if (rc) {
+                       of_node_put(child);
+                       break;
+               }
+       }
+ bail:
+       of_node_put(root);
+       return rc;
+}
+EXPORT_SYMBOL(of_platform_bus_probe);
+#endif /* !CONFIG_SPARC */
index 9a5b4b89416146827467946e77e96c36ac391c68..210a6441a0662c08953b510d813ef15af8c865ac 100644 (file)
@@ -295,7 +295,7 @@ static int __devinit bpp_probe(struct of_device *op, const struct of_device_id *
        void __iomem *base;
        struct parport *p;
 
-       irq = op->irqs[0];
+       irq = op->archdata.irqs[0];
        base = of_ioremap(&op->resource[0], 0,
                          resource_size(&op->resource[0]),
                          "sunbpp");
@@ -393,12 +393,12 @@ static struct of_platform_driver bpp_sbus_driver = {
 
 static int __init parport_sunbpp_init(void)
 {
-       return of_register_driver(&bpp_sbus_driver, &of_bus_type);
+       return of_register_platform_driver(&bpp_sbus_driver);
 }
 
 static void __exit parport_sunbpp_exit(void)
 {
-       of_unregister_driver(&bpp_sbus_driver);
+       of_unregister_platform_driver(&bpp_sbus_driver);
 }
 
 MODULE_AUTHOR("Derrick J Brashear");
index 8bfdd63a1fcbc085c33fbbab85c61e8675347138..3e89c313e98dddeab4b405a70007eb98aee4be31 100644 (file)
@@ -317,7 +317,7 @@ static struct bbc_i2c_bus * __init attach_one_i2c(struct of_device *op, int inde
 
        bp->waiting = 0;
        init_waitqueue_head(&bp->wq);
-       if (request_irq(op->irqs[0], bbc_i2c_interrupt,
+       if (request_irq(op->archdata.irqs[0], bbc_i2c_interrupt,
                        IRQF_SHARED, "bbc_i2c", bp))
                goto fail;
 
@@ -373,7 +373,7 @@ static int __devinit bbc_i2c_probe(struct of_device *op,
 
        err = bbc_envctrl_init(bp);
        if (err) {
-               free_irq(op->irqs[0], bp);
+               free_irq(op->archdata.irqs[0], bp);
                if (bp->i2c_bussel_reg)
                        of_iounmap(&op->resource[0], bp->i2c_bussel_reg, 1);
                if (bp->i2c_control_regs)
@@ -392,7 +392,7 @@ static int __devexit bbc_i2c_remove(struct of_device *op)
 
        bbc_envctrl_cleanup(bp);
 
-       free_irq(op->irqs[0], bp);
+       free_irq(op->archdata.irqs[0], bp);
 
        if (bp->i2c_bussel_reg)
                of_iounmap(&op->resource[0], bp->i2c_bussel_reg, 1);
@@ -425,12 +425,12 @@ static struct of_platform_driver bbc_i2c_driver = {
 
 static int __init bbc_i2c_init(void)
 {
-       return of_register_driver(&bbc_i2c_driver, &of_bus_type);
+       return of_register_platform_driver(&bbc_i2c_driver);
 }
 
 static void __exit bbc_i2c_exit(void)
 {
-       of_unregister_driver(&bbc_i2c_driver);
+       of_unregister_platform_driver(&bbc_i2c_driver);
 }
 
 module_init(bbc_i2c_init);
index 4ad4d2c91075f1e335cc7f6ea8fb1e5ddef757f8..47db97583ea7085ff1c74b6774eaa7a3be174c69 100644 (file)
@@ -277,12 +277,12 @@ static struct of_platform_driver d7s_driver = {
 
 static int __init d7s_init(void)
 {
-       return of_register_driver(&d7s_driver, &of_bus_type);
+       return of_register_platform_driver(&d7s_driver);
 }
 
 static void __exit d7s_exit(void)
 {
-       of_unregister_driver(&d7s_driver);
+       of_unregister_platform_driver(&d7s_driver);
 }
 
 module_init(d7s_init);
index bd0bbc621351db63966af1558a1d7bb8ab14bfce..3c27f45e2b6dd281fca4334cd1a11929ac7d7555 100644 (file)
@@ -1140,12 +1140,12 @@ static struct of_platform_driver envctrl_driver = {
 
 static int __init envctrl_init(void)
 {
-       return of_register_driver(&envctrl_driver, &of_bus_type);
+       return of_register_platform_driver(&envctrl_driver);
 }
 
 static void __exit envctrl_exit(void)
 {
-       of_unregister_driver(&envctrl_driver);
+       of_unregister_platform_driver(&envctrl_driver);
 }
 
 module_init(envctrl_init);
index ed9494e1885995568c478e28fdbc50e9cb6c71b4..8bb31c584b64f4bd2dd82a365ebe882cf4404bee 100644 (file)
@@ -219,12 +219,12 @@ static struct of_platform_driver flash_driver = {
 
 static int __init flash_init(void)
 {
-       return of_register_driver(&flash_driver, &of_bus_type);
+       return of_register_platform_driver(&flash_driver);
 }
 
 static void __exit flash_cleanup(void)
 {
-       of_unregister_driver(&flash_driver);
+       of_unregister_platform_driver(&flash_driver);
 }
 
 module_init(flash_init);
index 079da4cb45a5d951e719475893226df4cc08cf15..41eb6725ff5f21395829ebebebcece995fc92d1c 100644 (file)
@@ -368,7 +368,7 @@ static int __devinit uctrl_probe(struct of_device *op,
                goto out_free;
        }
 
-       p->irq = op->irqs[0];
+       p->irq = op->archdata.irqs[0];
        err = request_irq(p->irq, uctrl_interrupt, 0, "uctrl", p);
        if (err) {
                printk(KERN_ERR "uctrl: Unable to register irq.\n");
@@ -438,12 +438,12 @@ static struct of_platform_driver uctrl_driver = {
 
 static int __init uctrl_init(void)
 {
-       return of_register_driver(&uctrl_driver, &of_bus_type);
+       return of_register_platform_driver(&uctrl_driver);
 }
 
 static void __exit uctrl_exit(void)
 {
-       of_unregister_driver(&uctrl_driver);
+       of_unregister_platform_driver(&uctrl_driver);
 }
 
 module_init(uctrl_init);
index ca5c15c779cfc5a4d26659818545414b12682052..53d7ed0dc169b24c8e4350418817fc7c61819c55 100644 (file)
@@ -729,7 +729,7 @@ static int __devinit qpti_register_irq(struct qlogicpti *qpti)
 {
        struct of_device *op = qpti->op;
 
-       qpti->qhost->irq = qpti->irq = op->irqs[0];
+       qpti->qhost->irq = qpti->irq = op->archdata.irqs[0];
 
        /* We used to try various overly-clever things to
         * reduce the interrupt processing overhead on
@@ -1302,7 +1302,7 @@ static int __devinit qpti_sbus_probe(struct of_device *op, const struct of_devic
        /* Sometimes Antares cards come up not completely
         * setup, and we get a report of a zero IRQ.
         */
-       if (op->irqs[0] == 0)
+       if (op->archdata.irqs[0] == 0)
                return -ENODEV;
 
        host = scsi_host_alloc(tpnt, sizeof(struct qlogicpti));
@@ -1467,12 +1467,12 @@ static struct of_platform_driver qpti_sbus_driver = {
 
 static int __init qpti_init(void)
 {
-       return of_register_driver(&qpti_sbus_driver, &of_bus_type);
+       return of_register_platform_driver(&qpti_sbus_driver);
 }
 
 static void __exit qpti_exit(void)
 {
-       of_unregister_driver(&qpti_sbus_driver);
+       of_unregister_platform_driver(&qpti_sbus_driver);
 }
 
 MODULE_DESCRIPTION("QlogicISP SBUS driver");
index 386dd9d602b6e32ce4d262375caa4738ff9b1b5e..89ba6fe02f80e3e7f9c249ec10f7155b5e13ac4a 100644 (file)
@@ -116,7 +116,7 @@ static int __devinit esp_sbus_register_irq(struct esp *esp)
        struct Scsi_Host *host = esp->host;
        struct of_device *op = esp->dev;
 
-       host->irq = op->irqs[0];
+       host->irq = op->archdata.irqs[0];
        return request_irq(host->irq, scsi_esp_intr, IRQF_SHARED, "ESP", esp);
 }
 
@@ -644,12 +644,12 @@ static struct of_platform_driver esp_sbus_driver = {
 
 static int __init sunesp_init(void)
 {
-       return of_register_driver(&esp_sbus_driver, &of_bus_type);
+       return of_register_platform_driver(&esp_sbus_driver);
 }
 
 static void __exit sunesp_exit(void)
 {
-       of_unregister_driver(&esp_sbus_driver);
+       of_unregister_platform_driver(&esp_sbus_driver);
 }
 
 MODULE_DESCRIPTION("Sun ESP SCSI driver");
index 890f91742962433e8b710d060ede982070e09391..a779e22d213ee3abd9f5c1cfa6f267a4fdba96c8 100644 (file)
@@ -525,7 +525,7 @@ static int __devinit hv_probe(struct of_device *op, const struct of_device_id *m
        unsigned long minor;
        int err;
 
-       if (op->irqs[0] == 0xffffffff)
+       if (op->archdata.irqs[0] == 0xffffffff)
                return -ENODEV;
 
        port = kzalloc(sizeof(struct uart_port), GFP_KERNEL);
@@ -557,7 +557,7 @@ static int __devinit hv_probe(struct of_device *op, const struct of_device_id *m
 
        port->membase = (unsigned char __iomem *) __pa(port);
 
-       port->irq = op->irqs[0];
+       port->irq = op->archdata.irqs[0];
 
        port->dev = &op->dev;
 
@@ -644,12 +644,12 @@ static int __init sunhv_init(void)
        if (tlb_type != hypervisor)
                return -ENODEV;
 
-       return of_register_driver(&hv_driver, &of_bus_type);
+       return of_register_platform_driver(&hv_driver);
 }
 
 static void __exit sunhv_exit(void)
 {
-       of_unregister_driver(&hv_driver);
+       of_unregister_platform_driver(&hv_driver);
 }
 
 module_init(sunhv_init);
index 5e81bc6b48b0738ad307b9be94149da299f6063f..9845fb1cfb1ffea3438681f8c36f2c42fa58556d 100644 (file)
@@ -969,7 +969,7 @@ static int __devinit sunsab_init_one(struct uart_sunsab_port *up,
                return -ENOMEM;
        up->regs = (union sab82532_async_regs __iomem *) up->port.membase;
 
-       up->port.irq = op->irqs[0];
+       up->port.irq = op->archdata.irqs[0];
 
        up->port.fifosize = SAB82532_XMIT_FIFO_SIZE;
        up->port.iotype = UPIO_MEM;
@@ -1130,12 +1130,12 @@ static int __init sunsab_init(void)
                }
        }
 
-       return of_register_driver(&sab_driver, &of_bus_type);
+       return of_register_platform_driver(&sab_driver);
 }
 
 static void __exit sunsab_exit(void)
 {
-       of_unregister_driver(&sab_driver);
+       of_unregister_platform_driver(&sab_driver);
        if (sunsab_reg.nr) {
                sunserial_unregister_minors(&sunsab_reg, sunsab_reg.nr);
        }
index ffbf4553f6651966269b1be1bc57b43b37b34b98..3cdf74822db51336f98f955efcbebf95090b47cc 100644 (file)
@@ -1443,7 +1443,7 @@ static int __devinit su_probe(struct of_device *op, const struct of_device_id *m
                return -ENOMEM;
        }
 
-       up->port.irq = op->irqs[0];
+       up->port.irq = op->archdata.irqs[0];
 
        up->port.dev = &op->dev;
 
@@ -1586,7 +1586,7 @@ static int __init sunsu_init(void)
                        return err;
        }
 
-       err = of_register_driver(&su_driver, &of_bus_type);
+       err = of_register_platform_driver(&su_driver);
        if (err && num_uart)
                sunserial_unregister_minors(&sunsu_reg, num_uart);
 
index f9a24f4ebb3479626073c23ffa906320dcf025a5..d1e6bcb59546b993128edacac119182b834a01e3 100644 (file)
@@ -1426,7 +1426,7 @@ static int __devinit zs_probe(struct of_device *op, const struct of_device_id *m
        rp = sunzilog_chip_regs[inst];
 
        if (zilog_irq == -1)
-               zilog_irq = op->irqs[0];
+               zilog_irq = op->archdata.irqs[0];
 
        up = &sunzilog_port_table[inst * 2];
 
@@ -1434,7 +1434,7 @@ static int __devinit zs_probe(struct of_device *op, const struct of_device_id *m
        up[0].port.mapbase = op->resource[0].start + 0x00;
        up[0].port.membase = (void __iomem *) &rp->channelA;
        up[0].port.iotype = UPIO_MEM;
-       up[0].port.irq = op->irqs[0];
+       up[0].port.irq = op->archdata.irqs[0];
        up[0].port.uartclk = ZS_CLOCK;
        up[0].port.fifosize = 1;
        up[0].port.ops = &sunzilog_pops;
@@ -1451,7 +1451,7 @@ static int __devinit zs_probe(struct of_device *op, const struct of_device_id *m
        up[1].port.mapbase = op->resource[0].start + 0x04;
        up[1].port.membase = (void __iomem *) &rp->channelB;
        up[1].port.iotype = UPIO_MEM;
-       up[1].port.irq = op->irqs[0];
+       up[1].port.irq = op->archdata.irqs[0];
        up[1].port.uartclk = ZS_CLOCK;
        up[1].port.fifosize = 1;
        up[1].port.ops = &sunzilog_pops;
@@ -1492,12 +1492,12 @@ static int __devinit zs_probe(struct of_device *op, const struct of_device_id *m
                       "is a %s\n",
                       dev_name(&op->dev),
                       (unsigned long long) up[0].port.mapbase,
-                      op->irqs[0], sunzilog_type(&up[0].port));
+                      op->archdata.irqs[0], sunzilog_type(&up[0].port));
                printk(KERN_INFO "%s: Mouse at MMIO 0x%llx (irq = %d) "
                       "is a %s\n",
                       dev_name(&op->dev),
                       (unsigned long long) up[1].port.mapbase,
-                      op->irqs[0], sunzilog_type(&up[1].port));
+                      op->archdata.irqs[0], sunzilog_type(&up[1].port));
                kbm_inst++;
        }
 
@@ -1576,7 +1576,7 @@ static int __init sunzilog_init(void)
                        goto out_free_tables;
        }
 
-       err = of_register_driver(&zs_driver, &of_bus_type);
+       err = of_register_platform_driver(&zs_driver);
        if (err)
                goto out_unregister_uart;
 
@@ -1604,7 +1604,7 @@ out:
        return err;
 
 out_unregister_driver:
-       of_unregister_driver(&zs_driver);
+       of_unregister_platform_driver(&zs_driver);
 
 out_unregister_uart:
        if (num_sunzilog) {
@@ -1619,7 +1619,7 @@ out_free_tables:
 
 static void __exit sunzilog_exit(void)
 {
-       of_unregister_driver(&zs_driver);
+       of_unregister_platform_driver(&zs_driver);
 
        if (zilog_irq != -1) {
                struct uart_sunzilog_port *up = sunzilog_irq_chain;
index 8acccd564378aaa405f2fb04cf1958b532499993..caf085d3a76abdc18c8e2cca06e7304a503342d4 100644 (file)
@@ -21,6 +21,7 @@
 #include <asm/io.h>
 #if defined(CONFIG_OF) && (defined(CONFIG_PPC32) || defined(CONFIG_MICROBLAZE))
 #include <linux/of.h>
+#include <linux/of_address.h>
 #include <linux/of_device.h>
 #include <linux/of_platform.h>
 
index 2534b1ec3eddc5b39485c8fa71fff21dcbef07d3..10baac3f8ea53d1ed3a8cafe6b9d90dd561eb771 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/init.h>
 #include <linux/errno.h>
 #include <linux/interrupt.h>
+#include <linux/of_address.h>
 #include <linux/of_platform.h>
 #include <linux/workqueue.h>
 #include <linux/completion.h>
@@ -440,6 +441,7 @@ static int __init mpc512x_psc_spi_do_probe(struct device *dev, u32 regaddr,
        master->setup = mpc512x_psc_spi_setup;
        master->transfer = mpc512x_psc_spi_transfer;
        master->cleanup = mpc512x_psc_spi_cleanup;
+       master->dev.of_node = dev->of_node;
 
        tempp = ioremap(regaddr, size);
        if (!tempp) {
index 7104cb739da7eceab4af5a2bcf644c0aaa239d26..66d170147dccabc9cbb22d5c8e1d50af39225415 100644 (file)
@@ -16,8 +16,8 @@
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/interrupt.h>
+#include <linux/of_address.h>
 #include <linux/of_platform.h>
-#include <linux/of_spi.h>
 #include <linux/workqueue.h>
 #include <linux/completion.h>
 #include <linux/io.h>
@@ -398,6 +398,7 @@ static int __init mpc52xx_psc_spi_do_probe(struct device *dev, u32 regaddr,
        master->setup = mpc52xx_psc_spi_setup;
        master->transfer = mpc52xx_psc_spi_transfer;
        master->cleanup = mpc52xx_psc_spi_cleanup;
+       master->dev.of_node = dev->of_node;
 
        mps->psc = ioremap(regaddr, size);
        if (!mps->psc) {
@@ -470,7 +471,6 @@ static int __init mpc52xx_psc_spi_of_probe(struct of_device *op,
        const u32 *regaddr_p;
        u64 regaddr64, size64;
        s16 id = -1;
-       int rc;
 
        regaddr_p = of_get_address(op->dev.of_node, 0, &size64, NULL);
        if (!regaddr_p) {
@@ -491,13 +491,8 @@ static int __init mpc52xx_psc_spi_of_probe(struct of_device *op,
                id = *psc_nump + 1;
        }
 
-       rc = mpc52xx_psc_spi_do_probe(&op->dev, (u32)regaddr64, (u32)size64,
+       return mpc52xx_psc_spi_do_probe(&op->dev, (u32)regaddr64, (u32)size64,
                                irq_of_parse_and_map(op->dev.of_node, 0), id);
-       if (rc == 0)
-               of_register_spi_devices(dev_get_drvdata(&op->dev),
-                                       op->dev.of_node);
-
-       return rc;
 }
 
 static int __exit mpc52xx_psc_spi_of_remove(struct of_device *op)
index b1a76bff775f8f2c11e0c1d35efc41039fa95acf..56136ff00e01643dbfe46754e0f3aefce01d11dc 100644 (file)
@@ -18,7 +18,6 @@
 #include <linux/interrupt.h>
 #include <linux/delay.h>
 #include <linux/spi/spi.h>
-#include <linux/of_spi.h>
 #include <linux/io.h>
 #include <linux/of_gpio.h>
 #include <linux/slab.h>
@@ -439,6 +438,7 @@ static int __devinit mpc52xx_spi_probe(struct of_device *op,
        master->setup = mpc52xx_spi_setup;
        master->transfer = mpc52xx_spi_transfer;
        master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LSB_FIRST;
+       master->dev.of_node = op->dev.of_node;
 
        dev_set_drvdata(&op->dev, master);
 
@@ -512,7 +512,6 @@ static int __devinit mpc52xx_spi_probe(struct of_device *op,
        if (rc)
                goto err_register;
 
-       of_register_spi_devices(master, op->dev.of_node);
        dev_info(&ms->master->dev, "registered MPC5200 SPI bus\n");
 
        return rc;
index b3a1f9259b62539d6f2b3bd4c2a501f93c337cee..1bb1b88780cefc4cd69e88e15d4e1f5413c55d1e 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/slab.h>
 #include <linux/mod_devicetable.h>
 #include <linux/spi/spi.h>
+#include <linux/of_spi.h>
 
 
 /* SPI bustype and spi_master class are registered after board init code
@@ -540,6 +541,9 @@ int spi_register_master(struct spi_master *master)
        /* populate children from any spi device tables */
        scan_boardinfo(master);
        status = 0;
+
+       /* Register devices from the device tree */
+       of_register_spi_devices(master);
 done:
        return status;
 }
index 97ab0a81338adf036bea9e706dbcbe552b6d607c..aad9ae1b9c69093b829aa09c942b7a8a8b53dd78 100644 (file)
@@ -38,7 +38,6 @@
 #include <linux/of_platform.h>
 #include <linux/gpio.h>
 #include <linux/of_gpio.h>
-#include <linux/of_spi.h>
 #include <linux/slab.h>
 
 #include <sysdev/fsl_soc.h>
@@ -1009,6 +1008,7 @@ mpc8xxx_spi_probe(struct device *dev, struct resource *mem, unsigned int irq)
        master->setup = mpc8xxx_spi_setup;
        master->transfer = mpc8xxx_spi_transfer;
        master->cleanup = mpc8xxx_spi_cleanup;
+       master->dev.of_node = dev->of_node;
 
        mpc8xxx_spi = spi_master_get_devdata(master);
        mpc8xxx_spi->dev = dev;
@@ -1299,8 +1299,6 @@ static int __devinit of_mpc8xxx_spi_probe(struct of_device *ofdev,
                goto err;
        }
 
-       of_register_spi_devices(master, np);
-
        return 0;
 
 err:
index d53466a249d9700bb9108478a5b08ffcf1955b6a..0f5fa7e2a55041f6f4695bcd4f54f2f2167ff6d7 100644 (file)
@@ -407,6 +407,7 @@ static int __init spi_ppc4xx_of_probe(struct of_device *op,
        master = spi_alloc_master(dev, sizeof *hw);
        if (master == NULL)
                return -ENOMEM;
+       master->dev.of_node = np;
        dev_set_drvdata(dev, master);
        hw = spi_master_get_devdata(master);
        hw->master = spi_master_get(master);
@@ -545,7 +546,6 @@ static int __init spi_ppc4xx_of_probe(struct of_device *op,
        }
 
        dev_info(dev, "driver initialized\n");
-       of_register_spi_devices(master, np);
 
        return 0;
 
index 1b47363cb73f6d8c624b0af5bc44d2047e6ae8a7..80f2db5bcfd6e669bdd136c25f2d04ebb51d4595 100644 (file)
@@ -390,6 +390,9 @@ struct spi_master *xilinx_spi_init(struct device *dev, struct resource *mem,
 
        master->bus_num = bus_num;
        master->num_chipselect = pdata->num_chipselect;
+#ifdef CONFIG_OF
+       master->dev.of_node = dev->of_node;
+#endif
 
        xspi->mem = *mem;
        xspi->irq = irq;
index 4654805b08d887f8b44460ef174941040effc0b6..f53d3f6b9f611671ccc31d6bf5afb847882a9153 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/io.h>
 #include <linux/slab.h>
 
+#include <linux/of_address.h>
 #include <linux/of_platform.h>
 #include <linux/of_device.h>
 #include <linux/of_spi.h>
@@ -80,9 +81,6 @@ static int __devinit xilinx_spi_of_probe(struct of_device *ofdev,
 
        dev_set_drvdata(&ofdev->dev, master);
 
-       /* Add any subnodes on the SPI bus */
-       of_register_spi_devices(master, ofdev->dev.of_node);
-
        return 0;
 }
 
index 82506ca297d5f1632312f8d52b7f80b7aab49637..9648b75f0283e31d9b1c02c618b979fe3472ee41 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/interrupt.h>
 #include <linux/io.h>
 #include <linux/moduleparam.h>
+#include <linux/of_address.h>
 #include <linux/of_platform.h>
 #include <linux/dma-mapping.h>
 #include <linux/usb/ch9.h>
index 09f1b9b462f4a8a4ce86a600aa55a4cbf1685622..c7796637bafd2c1ae0d6501751e90d362e77e48e 100644 (file)
@@ -390,12 +390,12 @@ static int __init bw2_init(void)
        if (fb_get_options("bw2fb", NULL))
                return -ENODEV;
 
-       return of_register_driver(&bw2_driver, &of_bus_type);
+       return of_register_platform_driver(&bw2_driver);
 }
 
 static void __exit bw2_exit(void)
 {
-       of_unregister_driver(&bw2_driver);
+       of_unregister_platform_driver(&bw2_driver);
 }
 
 module_init(bw2_init);
index e5dc2241194fed66606c1e694aa4c77ed3357c81..d09fde8beb69b548bec3eac39a6399aa29a614a4 100644 (file)
@@ -610,12 +610,12 @@ static int __init cg14_init(void)
        if (fb_get_options("cg14fb", NULL))
                return -ENODEV;
 
-       return of_register_driver(&cg14_driver, &of_bus_type);
+       return of_register_platform_driver(&cg14_driver);
 }
 
 static void __exit cg14_exit(void)
 {
-       of_unregister_driver(&cg14_driver);
+       of_unregister_platform_driver(&cg14_driver);
 }
 
 module_init(cg14_init);
index 558d73a948a0d836c73ea20c26440229738ba581..64aa29809fb970dcb1740eb72e69cafb5cb62660 100644 (file)
@@ -477,12 +477,12 @@ static int __init cg3_init(void)
        if (fb_get_options("cg3fb", NULL))
                return -ENODEV;
 
-       return of_register_driver(&cg3_driver, &of_bus_type);
+       return of_register_platform_driver(&cg3_driver);
 }
 
 static void __exit cg3_exit(void)
 {
-       of_unregister_driver(&cg3_driver);
+       of_unregister_platform_driver(&cg3_driver);
 }
 
 module_init(cg3_init);
index 480d761a27a839b1e265eefe8204a17fb1f56504..2389a719dcc737e04043f7c6d01a5c172ae65481 100644 (file)
@@ -870,12 +870,12 @@ static int __init cg6_init(void)
        if (fb_get_options("cg6fb", NULL))
                return -ENODEV;
 
-       return of_register_driver(&cg6_driver, &of_bus_type);
+       return of_register_platform_driver(&cg6_driver);
 }
 
 static void __exit cg6_exit(void)
 {
-       of_unregister_driver(&cg6_driver);
+       of_unregister_platform_driver(&cg6_driver);
 }
 
 module_init(cg6_init);
index 49fcbe8f18ac4dbbd958f5e1973be85dda2875ae..c225dcce89e78f083f0e02c60b3064b29d001748 100644 (file)
@@ -40,6 +40,8 @@
 #include <linux/vmalloc.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
 #include <linux/fb.h>
 #include <linux/init.h>
 #include <linux/pci.h>
index 95c0227f47fcfd7fd30ea784b4202af1dace340a..f6ecfab296d39515f3639c3af2f618aa9a702f63 100644 (file)
@@ -1067,12 +1067,12 @@ static int __init ffb_init(void)
        if (fb_get_options("ffb", NULL))
                return -ENODEV;
 
-       return of_register_driver(&ffb_driver, &of_bus_type);
+       return of_register_platform_driver(&ffb_driver);
 }
 
 static void __exit ffb_exit(void)
 {
-       of_unregister_driver(&ffb_driver);
+       of_unregister_platform_driver(&ffb_driver);
 }
 
 module_init(ffb_init);
index 9e8bf7d5e249df2a3d0f3243181bab0b76b633a9..ad677637ffbb0e480e6c318e078a5fcae2f484c2 100644 (file)
@@ -677,12 +677,12 @@ static int __init leo_init(void)
        if (fb_get_options("leofb", NULL))
                return -ENODEV;
 
-       return of_register_driver(&leo_driver, &of_bus_type);
+       return of_register_platform_driver(&leo_driver);
 }
 
 static void __exit leo_exit(void)
 {
-       of_unregister_driver(&leo_driver);
+       of_unregister_platform_driver(&leo_driver);
 }
 
 module_init(leo_init);
index 46dda7d8aaeefae0d3a4b3a850ee6799e080a44d..cb163a5397beab1a592b836db2c273db3266351c 100644 (file)
 #include <linux/mm.h>
 #include <linux/vmalloc.h>
 #include <linux/delay.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
 #include <linux/interrupt.h>
 #include <linux/fb.h>
 #include <linux/init.h>
 #include <linux/ioport.h>
 #include <linux/pci.h>
 #include <asm/io.h>
-#include <asm/prom.h>
 
 #ifdef CONFIG_PPC64
 #include <asm/pci-bridge.h>
index 6552751e81aaa058a18af29ff8892d9abe1a54af..688b055abab2066811a3115bf270319f62dd811d 100644 (file)
@@ -367,12 +367,12 @@ static int __init p9100_init(void)
        if (fb_get_options("p9100fb", NULL))
                return -ENODEV;
 
-       return of_register_driver(&p9100_driver, &of_bus_type);
+       return of_register_platform_driver(&p9100_driver);
 }
 
 static void __exit p9100_exit(void)
 {
-       of_unregister_driver(&p9100_driver);
+       of_unregister_platform_driver(&p9100_driver);
 }
 
 module_init(p9100_init);
index 489b44e8db8153dac7a06bda8abae694c878d7e0..7288934c0d49dacfabee368b6498289f2cf635b5 100644 (file)
@@ -213,12 +213,12 @@ static int __init gfb_init(void)
        if (fb_get_options("gfb", NULL))
                return -ENODEV;
 
-       return of_register_driver(&gfb_driver, &of_bus_type);
+       return of_register_platform_driver(&gfb_driver);
 }
 
 static void __exit gfb_exit(void)
 {
-       of_unregister_driver(&gfb_driver);
+       of_unregister_platform_driver(&gfb_driver);
 }
 
 module_init(gfb_init);
index cc039b33d2d8bd762a493bd650fceb1b0895a52f..f375e0db6776bcefae43c2e26fa08a213c88d6c3 100644 (file)
@@ -526,12 +526,12 @@ static int __init tcx_init(void)
        if (fb_get_options("tcxfb", NULL))
                return -ENODEV;
 
-       return of_register_driver(&tcx_driver, &of_bus_type);
+       return of_register_platform_driver(&tcx_driver);
 }
 
 static void __exit tcx_exit(void)
 {
-       of_unregister_driver(&tcx_driver);
+       of_unregister_platform_driver(&tcx_driver);
 }
 
 module_init(tcx_init);
index d62b9ce8f773cb0d402bb43794b121bddae02209..30a2512fd52e30fef23cdac728eae59d4b3803af 100644 (file)
@@ -545,7 +545,7 @@ static int __devinit cpwd_probe(struct of_device *op,
                goto out;
        }
 
-       p->irq = op->irqs[0];
+       p->irq = op->archdata.irqs[0];
 
        spin_lock_init(&p->lock);
 
@@ -688,12 +688,12 @@ static struct of_platform_driver cpwd_driver = {
 
 static int __init cpwd_init(void)
 {
-       return of_register_driver(&cpwd_driver, &of_bus_type);
+       return of_register_platform_driver(&cpwd_driver);
 }
 
 static void __exit cpwd_exit(void)
 {
-       of_unregister_driver(&cpwd_driver);
+       of_unregister_platform_driver(&cpwd_driver);
 }
 
 module_init(cpwd_init);
index 5dceeddc88596c833add1e6abc2ec5db65048279..4082b4ace1fce159089924d6718918e182fc67f7 100644 (file)
@@ -250,12 +250,12 @@ static struct of_platform_driver riowd_driver = {
 
 static int __init riowd_init(void)
 {
-       return of_register_driver(&riowd_driver, &of_bus_type);
+       return of_register_platform_driver(&riowd_driver);
 }
 
 static void __exit riowd_exit(void)
 {
-       of_unregister_driver(&riowd_driver);
+       of_unregister_platform_driver(&riowd_driver);
 }
 
 module_init(riowd_init);
index 4f3d75e1ad391a669d842c7c58e65b46bfd9cbd4..c7376bf80b0604bf8f8b9394989178d6de45ecc2 100644 (file)
@@ -31,6 +31,7 @@ static inline int gpio_is_valid(int number)
 struct device;
 struct seq_file;
 struct module;
+struct device_node;
 
 /**
  * struct gpio_chip - abstract a GPIO controller
@@ -106,6 +107,17 @@ struct gpio_chip {
        const char              *const *names;
        unsigned                can_sleep:1;
        unsigned                exported:1;
+
+#if defined(CONFIG_OF_GPIO)
+       /*
+        * If CONFIG_OF is enabled, then all GPIO controllers described in the
+        * device tree automatically may have an OF translation
+        */
+       struct device_node *of_node;
+       int of_gpio_n_cells;
+       int (*of_xlate)(struct gpio_chip *gc, struct device_node *np,
+                       const void *gpio_spec, u32 *flags);
+#endif
 };
 
 extern const char *gpiochip_is_requested(struct gpio_chip *chip,
@@ -115,6 +127,9 @@ extern int __must_check gpiochip_reserve(int start, int ngpio);
 /* add/remove chips */
 extern int gpiochip_add(struct gpio_chip *chip);
 extern int __must_check gpiochip_remove(struct gpio_chip *chip);
+extern struct gpio_chip *gpiochip_find(void *data,
+                                       int (*match)(struct gpio_chip *chip,
+                                                    void *data));
 
 
 /* Always use the library code for GPIO management calls,
index a367e19bb3afef4b4da81b5f0676a87b7e1911da..cad7cf0ab27855f6fff3e35fb9b95a96867a9e91 100644 (file)
@@ -70,6 +70,11 @@ extern struct device_node *allnodes;
 extern struct device_node *of_chosen;
 extern rwlock_t devtree_lock;
 
+static inline bool of_node_is_root(const struct device_node *node)
+{
+       return node && (node->parent == NULL);
+}
+
 static inline int of_node_check_flag(struct device_node *n, unsigned long flag)
 {
        return test_bit(flag, &n->_flags);
@@ -141,6 +146,11 @@ static inline unsigned long of_read_ulong(const __be32 *cell, int size)
 
 #define OF_BAD_ADDR    ((u64)-1)
 
+#ifndef of_node_to_nid
+static inline int of_node_to_nid(struct device_node *np) { return -1; }
+#define of_node_to_nid of_node_to_nid
+#endif
+
 extern struct device_node *of_find_node_by_name(struct device_node *from,
        const char *name);
 #define for_each_node_by_name(dn, name) \
diff --git a/include/linux/of_address.h b/include/linux/of_address.h
new file mode 100644 (file)
index 0000000..8aea06f
--- /dev/null
@@ -0,0 +1,44 @@
+#ifndef __OF_ADDRESS_H
+#define __OF_ADDRESS_H
+#include <linux/ioport.h>
+#include <linux/of.h>
+
+extern u64 of_translate_address(struct device_node *np, const u32 *addr);
+extern int of_address_to_resource(struct device_node *dev, int index,
+                                 struct resource *r);
+extern void __iomem *of_iomap(struct device_node *device, int index);
+
+/* Extract an address from a device, returns the region size and
+ * the address space flags too. The PCI version uses a BAR number
+ * instead of an absolute index
+ */
+extern const u32 *of_get_address(struct device_node *dev, int index,
+                          u64 *size, unsigned int *flags);
+
+#ifndef pci_address_to_pio
+static inline unsigned long pci_address_to_pio(phys_addr_t addr) { return -1; }
+#define pci_address_to_pio pci_address_to_pio
+#endif
+
+#ifdef CONFIG_PCI
+extern const u32 *of_get_pci_address(struct device_node *dev, int bar_no,
+                              u64 *size, unsigned int *flags);
+extern int of_pci_address_to_resource(struct device_node *dev, int bar,
+                                     struct resource *r);
+#else /* CONFIG_PCI */
+static inline int of_pci_address_to_resource(struct device_node *dev, int bar,
+                                            struct resource *r)
+{
+       return -ENOSYS;
+}
+
+static inline const u32 *of_get_pci_address(struct device_node *dev,
+               int bar_no, u64 *size, unsigned int *flags)
+{
+       return NULL;
+}
+#endif /* CONFIG_PCI */
+
+
+#endif /* __OF_ADDRESS_H */
+
index 11651facc5f179237500ea4d43e3bcc76bfe270d..35aa44ad9f2cb21b7ce2422dfbae2fc296aba7cc 100644 (file)
@@ -1,32 +1,77 @@
 #ifndef _LINUX_OF_DEVICE_H
 #define _LINUX_OF_DEVICE_H
 
+/*
+ * The of_device *was* a kind of "base class" that was a superset of
+ * struct device for use by devices attached to an OF node and probed
+ * using OF properties.  However, the important bit of OF-style
+ * probing, namely the device node pointer, has been moved into the
+ * common struct device when CONFIG_OF is set to make OF-style probing
+ * available to all bus types.  So now, just make of_device and
+ * platform_device equivalent so that current of_platform bus users
+ * can be transparently migrated over to using the platform bus.
+ *
+ * This line will go away once all references to of_device are removed
+ * from the kernel.
+ */
+#define of_device platform_device
+#include <linux/platform_device.h>
+#include <linux/of_platform.h> /* temporary until merge */
+
 #ifdef CONFIG_OF_DEVICE
 #include <linux/device.h>
 #include <linux/of.h>
 #include <linux/mod_devicetable.h>
 
-#include <asm/of_device.h>
-
 #define        to_of_device(d) container_of(d, struct of_device, dev)
 
 extern const struct of_device_id *of_match_device(
        const struct of_device_id *matches, const struct device *dev);
+extern void of_device_make_bus_id(struct device *dev);
+
+/**
+ * of_driver_match_device - Tell if a driver's of_match_table matches a device.
+ * @drv: the device_driver structure to test
+ * @dev: the device structure to match against
+ */
+static inline int of_driver_match_device(const struct device *dev,
+                                        const struct device_driver *drv)
+{
+       return of_match_device(drv->of_match_table, dev) != NULL;
+}
 
-extern struct of_device *of_dev_get(struct of_device *dev);
-extern void of_dev_put(struct of_device *dev);
+extern struct platform_device *of_dev_get(struct platform_device *dev);
+extern void of_dev_put(struct platform_device *dev);
 
-extern int of_device_register(struct of_device *ofdev);
-extern void of_device_unregister(struct of_device *ofdev);
+extern int of_device_register(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 of_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 of_device *ofdev,
+extern ssize_t of_device_get_modalias(struct device *dev,
                                        char *str, ssize_t len);
+
+extern int of_device_uevent(struct device *dev, struct kobj_uevent_env *env);
+
+
+#else /* CONFIG_OF_DEVICE */
+
+static inline int of_driver_match_device(struct device *dev,
+                                        struct device_driver *drv)
+{
+       return 0;
+}
+
+static inline int of_device_uevent(struct device *dev,
+                                  struct kobj_uevent_env *env)
+{
+       return -ENODEV;
+}
+
 #endif /* CONFIG_OF_DEVICE */
 
 #endif /* _LINUX_OF_DEVICE_H */
index fc2472c3c254caf90956d6850ca0381e51a5fed7..6598c04dab01249e47722e928bb2c379b922dbba 100644 (file)
@@ -32,35 +32,18 @@ enum of_gpio_flags {
 
 #ifdef CONFIG_OF_GPIO
 
-/*
- * Generic OF GPIO chip
- */
-struct of_gpio_chip {
-       struct gpio_chip gc;
-       int gpio_cells;
-       int (*xlate)(struct of_gpio_chip *of_gc, struct device_node *np,
-                    const void *gpio_spec, enum of_gpio_flags *flags);
-};
-
-static inline struct of_gpio_chip *to_of_gpio_chip(struct gpio_chip *gc)
-{
-       return container_of(gc, struct of_gpio_chip, gc);
-}
-
 /*
  * OF GPIO chip for memory mapped banks
  */
 struct of_mm_gpio_chip {
-       struct of_gpio_chip of_gc;
+       struct gpio_chip gc;
        void (*save_regs)(struct of_mm_gpio_chip *mm_gc);
        void __iomem *regs;
 };
 
 static inline struct of_mm_gpio_chip *to_of_mm_gpio_chip(struct gpio_chip *gc)
 {
-       struct of_gpio_chip *of_gc = to_of_gpio_chip(gc);
-
-       return container_of(of_gc, struct of_mm_gpio_chip, of_gc);
+       return container_of(gc, struct of_mm_gpio_chip, gc);
 }
 
 extern int of_get_gpio_flags(struct device_node *np, int index,
@@ -69,11 +52,12 @@ extern unsigned int of_gpio_count(struct device_node *np);
 
 extern int of_mm_gpiochip_add(struct device_node *np,
                              struct of_mm_gpio_chip *mm_gc);
-extern int of_gpio_simple_xlate(struct of_gpio_chip *of_gc,
-                               struct device_node *np,
-                               const void *gpio_spec,
-                               enum of_gpio_flags *flags);
-#else
+
+extern void of_gpiochip_add(struct gpio_chip *gc);
+extern void of_gpiochip_remove(struct gpio_chip *gc);
+extern struct gpio_chip *of_node_to_gpiochip(struct device_node *np);
+
+#else /* CONFIG_OF_GPIO */
 
 /* Drivers may not strictly depend on the GPIO support, so let them link. */
 static inline int of_get_gpio_flags(struct device_node *np, int index,
@@ -87,6 +71,9 @@ static inline unsigned int of_gpio_count(struct device_node *np)
        return 0;
 }
 
+static inline void of_gpiochip_add(struct gpio_chip *gc) { }
+static inline void of_gpiochip_remove(struct gpio_chip *gc) { }
+
 #endif /* CONFIG_OF_GPIO */
 
 /**
index 34974b5a76f78d1d9d142c3df4fb0e23a0ba106e..0efe8d465f555d4a2c0f5e7ac26d97c28867db68 100644 (file)
 #ifndef __LINUX_OF_I2C_H
 #define __LINUX_OF_I2C_H
 
+#if defined(CONFIG_OF_I2C) || defined(CONFIG_OF_I2C_MODULE)
 #include <linux/i2c.h>
 
-void of_register_i2c_devices(struct i2c_adapter *adap,
-                            struct device_node *adap_node);
+extern void of_i2c_register_devices(struct i2c_adapter *adap);
 
 /* must call put_device() when done with returned i2c_client device */
-struct i2c_client *of_find_i2c_device_by_node(struct device_node *node);
+extern struct i2c_client *of_find_i2c_device_by_node(struct device_node *node);
+
+#else
+static inline void of_i2c_register_devices(struct i2c_adapter *adap)
+{
+       return;
+}
+#endif /* CONFIG_OF_I2C */
 
 #endif /* __LINUX_OF_I2C_H */
diff --git a/include/linux/of_irq.h b/include/linux/of_irq.h
new file mode 100644 (file)
index 0000000..5929781
--- /dev/null
@@ -0,0 +1,70 @@
+#ifndef __OF_IRQ_H
+#define __OF_IRQ_H
+
+#if defined(CONFIG_OF)
+struct of_irq;
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <linux/ioport.h>
+#include <linux/of.h>
+
+/*
+ * irq_of_parse_and_map() is used ba all OF enabled platforms; but SPARC
+ * implements it differently.  However, the prototype is the same for all,
+ * so declare it here regardless of the CONFIG_OF_IRQ setting.
+ */
+extern unsigned int irq_of_parse_and_map(struct device_node *node, int index);
+
+#if defined(CONFIG_OF_IRQ)
+/**
+ * of_irq - container for device_node/irq_specifier pair for an irq controller
+ * @controller: pointer to interrupt controller device tree node
+ * @size: size of interrupt specifier
+ * @specifier: array of cells @size long specifing the specific interrupt
+ *
+ * This structure is returned when an interrupt is mapped. The controller
+ * field needs to be put() after use
+ */
+#define OF_MAX_IRQ_SPEC                4 /* We handle specifiers of at most 4 cells */
+struct of_irq {
+       struct device_node *controller; /* Interrupt controller node */
+       u32 size; /* Specifier size */
+       u32 specifier[OF_MAX_IRQ_SPEC]; /* Specifier copy */
+};
+
+/*
+ * Workarounds only applied to 32bit powermac machines
+ */
+#define OF_IMAP_OLDWORLD_MAC   0x00000001
+#define OF_IMAP_NO_PHANDLE     0x00000002
+
+#if defined(CONFIG_PPC32) && defined(CONFIG_PPC_PMAC)
+extern unsigned int of_irq_workarounds;
+extern struct device_node *of_irq_dflt_pic;
+extern int of_irq_map_oldworld(struct device_node *device, int index,
+                              struct of_irq *out_irq);
+#else /* CONFIG_PPC32 && CONFIG_PPC_PMAC */
+#define of_irq_workarounds (0)
+#define of_irq_dflt_pic (NULL)
+static inline int of_irq_map_oldworld(struct device_node *device, int index,
+                                     struct of_irq *out_irq)
+{
+       return -EINVAL;
+}
+#endif /* CONFIG_PPC32 && CONFIG_PPC_PMAC */
+
+
+extern int of_irq_map_raw(struct device_node *parent, const u32 *intspec,
+                         u32 ointsize, const u32 *addr,
+                         struct of_irq *out_irq);
+extern int of_irq_map_one(struct device_node *device, int index,
+                         struct of_irq *out_irq);
+extern unsigned int irq_create_of_mapping(struct device_node *controller,
+                                         const u32 *intspec,
+                                         unsigned int intsize);
+extern int of_irq_to_resource(struct device_node *dev, int index,
+                             struct resource *r);
+
+#endif /* CONFIG_OF_IRQ */
+#endif /* CONFIG_OF */
+#endif /* __OF_IRQ_H */
index 1643d3761eb4134897b956bed7844b05814fd662..4e6d989c06dfe9fdfe2fdd5cd35cc4da22737a33 100644 (file)
 #include <linux/mod_devicetable.h>
 #include <linux/pm.h>
 #include <linux/of_device.h>
-
-/*
- * The of_platform_bus_type is a bus type used by drivers that do not
- * attach to a macio or similar bus but still use OF probing
- * mechanism
- */
-extern struct bus_type of_platform_bus_type;
+#include <linux/platform_device.h>
 
 /*
  * An of_platform_driver driver is attached to a basic of_device on
- * the "platform bus" (of_platform_bus_type).
+ * the "platform bus" (platform_bus_type).
  */
 struct of_platform_driver
 {
-       int     (*probe)(struct of_device* dev,
+       int     (*probe)(struct platform_device* dev,
                         const struct of_device_id *match);
-       int     (*remove)(struct of_device* dev);
+       int     (*remove)(struct platform_device* dev);
 
-       int     (*suspend)(struct of_device* dev, pm_message_t state);
-       int     (*resume)(struct of_device* dev);
-       int     (*shutdown)(struct of_device* dev);
+       int     (*suspend)(struct platform_device* dev, pm_message_t state);
+       int     (*resume)(struct platform_device* dev);
+       int     (*shutdown)(struct platform_device* dev);
 
        struct device_driver    driver;
+       struct platform_driver  platform_driver;
 };
 #define        to_of_platform_driver(drv) \
        container_of(drv,struct of_platform_driver, driver)
@@ -49,20 +44,30 @@ extern int of_register_driver(struct of_platform_driver *drv,
 extern void of_unregister_driver(struct of_platform_driver *drv);
 
 /* Platform drivers register/unregister */
-static inline int of_register_platform_driver(struct of_platform_driver *drv)
-{
-       return of_register_driver(drv, &of_platform_bus_type);
-}
-static inline void of_unregister_platform_driver(struct of_platform_driver *drv)
-{
-       of_unregister_driver(drv);
-}
+extern int of_register_platform_driver(struct of_platform_driver *drv);
+extern void of_unregister_platform_driver(struct of_platform_driver *drv);
 
-#include <asm/of_platform.h>
-
-extern struct of_device *of_find_device_by_node(struct device_node *np);
+extern struct platform_device *of_device_alloc(struct device_node *np,
+                                        const char *bus_id,
+                                        struct device *parent);
+extern struct platform_device *of_find_device_by_node(struct device_node *np);
 
 extern int of_bus_type_init(struct bus_type *bus, const char *name);
+
+#if !defined(CONFIG_SPARC) /* SPARC has its own device registration method */
+/* Platform devices and busses creation */
+extern struct platform_device *of_platform_device_create(struct device_node *np,
+                                                  const char *bus_id,
+                                                  struct device *parent);
+
+/* pseudo "matches" value to not do deep probe */
+#define OF_NO_DEEP_PROBE ((struct of_device_id *)-1)
+
+extern int of_platform_bus_probe(struct device_node *root,
+                                const struct of_device_id *matches,
+                                struct device *parent);
+#endif /* !CONFIG_SPARC */
+
 #endif /* CONFIG_OF_DEVICE */
 
 #endif /* _LINUX_OF_PLATFORM_H */
index 5f71ee8c0868d6d549ded2ca2ffbbfa837160584..9e3e70f78ae64c4077917d330923d9868e290cfc 100644 (file)
@@ -9,10 +9,15 @@
 #ifndef __LINUX_OF_SPI_H
 #define __LINUX_OF_SPI_H
 
-#include <linux/of.h>
 #include <linux/spi/spi.h>
 
-extern void of_register_spi_devices(struct spi_master *master,
-                                   struct device_node *np);
+#if defined(CONFIG_OF_SPI) || defined(CONFIG_OF_SPI_MODULE)
+extern void of_register_spi_devices(struct spi_master *master);
+#else
+static inline void of_register_spi_devices(struct spi_master *master)
+{
+       return;
+}
+#endif /* CONFIG_OF_SPI */
 
 #endif /* __LINUX_OF_SPI */
index 71221fd209445b55a09093986a7a330546277381..9eb1a4e0363be8ba203f78ffde906ea202f0e319 100644 (file)
@@ -1010,7 +1010,7 @@ static int __devinit amd7930_sbus_probe(struct of_device *op, const struct of_de
        struct snd_amd7930 *amd;
        int err, irq;
 
-       irq = op->irqs[0];
+       irq = op->archdata.irqs[0];
 
        if (dev_num >= SNDRV_CARDS)
                return -ENODEV;
@@ -1075,7 +1075,7 @@ static struct of_platform_driver amd7930_sbus_driver = {
 
 static int __init amd7930_init(void)
 {
-       return of_register_driver(&amd7930_sbus_driver, &of_bus_type);
+       return of_register_platform_driver(&amd7930_sbus_driver);
 }
 
 static void __exit amd7930_exit(void)
@@ -1092,7 +1092,7 @@ static void __exit amd7930_exit(void)
 
        amd7930_list = NULL;
 
-       of_unregister_driver(&amd7930_sbus_driver);
+       of_unregister_platform_driver(&amd7930_sbus_driver);
 }
 
 module_init(amd7930_init);
index fb4c6f2f29e5d1b97a69ec2ccd00d6ff7b750ff4..68570ee2c9bb91079a0948d4832fd0c0a2079eea 100644 (file)
@@ -1832,14 +1832,14 @@ static int __devinit snd_cs4231_sbus_create(struct snd_card *card,
        chip->c_dma.request = sbus_dma_request;
        chip->c_dma.address = sbus_dma_addr;
 
-       if (request_irq(op->irqs[0], snd_cs4231_sbus_interrupt,
+       if (request_irq(op->archdata.irqs[0], snd_cs4231_sbus_interrupt,
                        IRQF_SHARED, "cs4231", chip)) {
                snd_printdd("cs4231-%d: Unable to grab SBUS IRQ %d\n",
-                           dev, op->irqs[0]);
+                           dev, op->archdata.irqs[0]);
                snd_cs4231_sbus_free(chip);
                return -EBUSY;
        }
-       chip->irq[0] = op->irqs[0];
+       chip->irq[0] = op->archdata.irqs[0];
 
        if (snd_cs4231_probe(chip) < 0) {
                snd_cs4231_sbus_free(chip);
@@ -1870,7 +1870,7 @@ static int __devinit cs4231_sbus_probe(struct of_device *op, const struct of_dev
                card->shortname,
                rp->flags & 0xffL,
                (unsigned long long)rp->start,
-               op->irqs[0]);
+               op->archdata.irqs[0]);
 
        err = snd_cs4231_sbus_create(card, op, dev);
        if (err < 0) {
@@ -1979,12 +1979,12 @@ static int __devinit snd_cs4231_ebus_create(struct snd_card *card,
        chip->c_dma.ebus_info.flags = EBUS_DMA_FLAG_USE_EBDMA_HANDLER;
        chip->c_dma.ebus_info.callback = snd_cs4231_ebus_capture_callback;
        chip->c_dma.ebus_info.client_cookie = chip;
-       chip->c_dma.ebus_info.irq = op->irqs[0];
+       chip->c_dma.ebus_info.irq = op->archdata.irqs[0];
        strcpy(chip->p_dma.ebus_info.name, "cs4231(play)");
        chip->p_dma.ebus_info.flags = EBUS_DMA_FLAG_USE_EBDMA_HANDLER;
        chip->p_dma.ebus_info.callback = snd_cs4231_ebus_play_callback;
        chip->p_dma.ebus_info.client_cookie = chip;
-       chip->p_dma.ebus_info.irq = op->irqs[1];
+       chip->p_dma.ebus_info.irq = op->archdata.irqs[1];
 
        chip->p_dma.prepare = _ebus_dma_prepare;
        chip->p_dma.enable = _ebus_dma_enable;
@@ -2060,7 +2060,7 @@ static int __devinit cs4231_ebus_probe(struct of_device *op, const struct of_dev
        sprintf(card->longname, "%s at 0x%llx, irq %d",
                card->shortname,
                op->resource[0].start,
-               op->irqs[0]);
+               op->archdata.irqs[0]);
 
        err = snd_cs4231_ebus_create(card, op, dev);
        if (err < 0) {
@@ -2120,12 +2120,12 @@ static struct of_platform_driver cs4231_driver = {
 
 static int __init cs4231_init(void)
 {
-       return of_register_driver(&cs4231_driver, &of_bus_type);
+       return of_register_platform_driver(&cs4231_driver);
 }
 
 static void __exit cs4231_exit(void)
 {
-       of_unregister_driver(&cs4231_driver);
+       of_unregister_platform_driver(&cs4231_driver);
 }
 
 module_init(cs4231_init);
index 1557bf132e732fe172a383f3f64cec7ca4bb27f4..c421901c48d0f40286da25ae42425e528afc8767 100644 (file)
@@ -2608,7 +2608,7 @@ static int __devinit dbri_probe(struct of_device *op, const struct of_device_id
                return -ENOENT;
        }
 
-       irq = op->irqs[0];
+       irq = op->archdata.irqs[0];
        if (irq <= 0) {
                printk(KERN_ERR "DBRI-%d: No IRQ.\n", dev);
                return -ENODEV;
@@ -2699,12 +2699,12 @@ static struct of_platform_driver dbri_sbus_driver = {
 /* Probe for the dbri chip and then attach the driver. */
 static int __init dbri_init(void)
 {
-       return of_register_driver(&dbri_sbus_driver, &of_bus_type);
+       return of_register_platform_driver(&dbri_sbus_driver);
 }
 
 static void __exit dbri_exit(void)
 {
-       of_unregister_driver(&dbri_sbus_driver);
+       of_unregister_platform_driver(&dbri_sbus_driver);
 }
 
 module_init(dbri_init);