Merge branch 'next-devicetree' of git://git.secretlab.ca/git/linux-2.6
* '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.
This commit is contained in:
@@ -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) \
|
||||
|
44
include/linux/of_address.h
Normal file
44
include/linux/of_address.h
Normal file
@@ -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 */
|
||||
|
@@ -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);
|
||||
|
||||
extern struct of_device *of_dev_get(struct of_device *dev);
|
||||
extern void of_dev_put(struct of_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 int of_device_register(struct of_device *ofdev);
|
||||
extern void of_device_unregister(struct of_device *ofdev);
|
||||
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 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 */
|
||||
|
@@ -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 */
|
||||
|
||||
/**
|
||||
|
@@ -12,12 +12,19 @@
|
||||
#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 */
|
||||
|
70
include/linux/of_irq.h
Normal file
70
include/linux/of_irq.h
Normal file
@@ -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 */
|
@@ -17,29 +17,24 @@
|
||||
#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 */
|
||||
|
@@ -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 */
|
||||
|
Reference in New Issue
Block a user