Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6: (40 commits) [SPARC64]: Update defconfig. [SPARC64]: Make auxio a real driver. [PARPORT] sunbpp: Convert to new SBUS device framework. [Documentation]: Update probing info in sbus_drivers.txt [SCSI] qlogicpti: Convert to new SBUS device framework. [SCSI] esp: Fix bug in esp_remove_common. [NET] sunhme: Kill useless loop over sdevs in quattro_sbus_find(). [NET] myri_sbus: Kill unused next_module struct member. [NET] myri_sbus: Convert to new SBUS device layer. [NET] sunqe: Convert to new SBUS driver layer. [NET] sunbmac: Convert over to new SBUS device framework. [NET] sunlance: Convert to new SBUS driver framework. [NET] sunhme: Convert to new SBUS driver framework. [NET] sunhme: Kill __sparc__ and __sparc_v9__ ifdefs. [SCSI] sparc: Port esp to new SBUS driver layer. [SOUND] sparc: Port amd7930 to new SBUS device layer. [SBUS]: Rewrite and plug into of_device framework. [SPARC]: Port of_device layer and make ebus use it. [SPARC]: Port sparc64 in-kernel device tree code to sparc32. [SPARC64]: Add of_device layer and make ebus/isa use it. ...
This commit is contained in:
@@ -13,13 +13,14 @@
|
||||
#include <linux/ioport.h>
|
||||
#endif
|
||||
#include <asm/oplib.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/of_device.h>
|
||||
|
||||
struct linux_ebus_child {
|
||||
struct linux_ebus_child *next;
|
||||
struct linux_ebus_device *parent;
|
||||
struct linux_ebus *bus;
|
||||
int prom_node;
|
||||
char prom_name[64];
|
||||
struct device_node *prom_node;
|
||||
struct resource resource[PROMREG_MAX];
|
||||
int num_addrs;
|
||||
unsigned int irqs[PROMINTR_MAX];
|
||||
@@ -27,27 +28,27 @@ struct linux_ebus_child {
|
||||
};
|
||||
|
||||
struct linux_ebus_device {
|
||||
struct of_device ofdev;
|
||||
struct linux_ebus_device *next;
|
||||
struct linux_ebus_child *children;
|
||||
struct linux_ebus *bus;
|
||||
int prom_node;
|
||||
char prom_name[64];
|
||||
struct device_node *prom_node;
|
||||
struct resource resource[PROMREG_MAX];
|
||||
int num_addrs;
|
||||
unsigned int irqs[PROMINTR_MAX];
|
||||
int num_irqs;
|
||||
};
|
||||
#define to_ebus_device(d) container_of(d, struct linux_ebus_device, ofdev.dev)
|
||||
|
||||
struct linux_ebus {
|
||||
struct of_device ofdev;
|
||||
struct linux_ebus *next;
|
||||
struct linux_ebus_device *devices;
|
||||
struct linux_pbm_info *parent;
|
||||
struct pci_dev *self;
|
||||
int prom_node;
|
||||
char prom_name[64];
|
||||
struct linux_prom_ebus_ranges ebus_ranges[PROMREG_MAX];
|
||||
int num_ebus_ranges;
|
||||
struct device_node *prom_node;
|
||||
};
|
||||
#define to_ebus(d) container_of(d, struct linux_ebus, ofdev.dev)
|
||||
|
||||
struct linux_ebus_dma {
|
||||
unsigned int dcsr;
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
#ifndef _ASM_SPARC_OF_DEVICE_H
|
||||
#define _ASM_SPARC_OF_DEVICE_H
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <asm/prom.h>
|
||||
|
||||
extern struct bus_type ebus_bus_type;
|
||||
extern struct bus_type sbus_bus_type;
|
||||
|
||||
/*
|
||||
* 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_node *node; /* OF device node */
|
||||
struct device dev; /* Generic device interface */
|
||||
};
|
||||
#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 of_device *dev);
|
||||
|
||||
extern struct of_device *of_dev_get(struct of_device *dev);
|
||||
extern void of_dev_put(struct of_device *dev);
|
||||
|
||||
/*
|
||||
* An of_platform_driver driver is attached to a basic of_device on
|
||||
* the ISA, EBUS, and SBUS busses on sparc64.
|
||||
*/
|
||||
struct of_platform_driver
|
||||
{
|
||||
char *name;
|
||||
struct of_device_id *match_table;
|
||||
struct module *owner;
|
||||
|
||||
int (*probe)(struct of_device* dev, const struct of_device_id *match);
|
||||
int (*remove)(struct of_device* dev);
|
||||
|
||||
int (*suspend)(struct of_device* dev, pm_message_t state);
|
||||
int (*resume)(struct of_device* dev);
|
||||
int (*shutdown)(struct of_device* dev);
|
||||
|
||||
struct device_driver driver;
|
||||
};
|
||||
#define to_of_platform_driver(drv) container_of(drv,struct of_platform_driver, driver)
|
||||
|
||||
extern int of_register_driver(struct of_platform_driver *drv,
|
||||
struct bus_type *bus);
|
||||
extern void of_unregister_driver(struct of_platform_driver *drv);
|
||||
extern int of_device_register(struct of_device *ofdev);
|
||||
extern void of_device_unregister(struct of_device *ofdev);
|
||||
extern struct of_device *of_platform_device_create(struct device_node *np,
|
||||
const char *bus_id,
|
||||
struct device *parent,
|
||||
struct bus_type *bus);
|
||||
extern void of_release_dev(struct device *dev);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_SPARC_OF_DEVICE_H */
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#include <linux/pci.h>
|
||||
#include <asm/oplib.h>
|
||||
#include <asm/prom.h>
|
||||
|
||||
struct linux_pbm_info {
|
||||
int prom_node;
|
||||
@@ -40,7 +41,7 @@ struct linux_pbm_info {
|
||||
*/
|
||||
struct pcidev_cookie {
|
||||
struct linux_pbm_info *pbm;
|
||||
int prom_node;
|
||||
struct device_node *prom_node;
|
||||
};
|
||||
|
||||
#endif /* !(__SPARC_PBM_H) */
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
#ifndef _SPARC_PROM_H
|
||||
#define _SPARC_PROM_H
|
||||
#ifdef __KERNEL__
|
||||
|
||||
|
||||
/*
|
||||
* Definitions for talking to the Open Firmware PROM on
|
||||
* Power Macintosh computers.
|
||||
*
|
||||
* Copyright (C) 1996-2005 Paul Mackerras.
|
||||
*
|
||||
* Updates for PPC64 by Peter Bergner & David Engebretsen, IBM Corp.
|
||||
* Updates for SPARC32 by David S. Miller
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <asm/atomic.h>
|
||||
|
||||
typedef u32 phandle;
|
||||
typedef u32 ihandle;
|
||||
|
||||
struct interrupt_info {
|
||||
int line;
|
||||
int sense; /* +ve/-ve logic, edge or level, etc. */
|
||||
};
|
||||
|
||||
struct property {
|
||||
char *name;
|
||||
int length;
|
||||
void *value;
|
||||
struct property *next;
|
||||
};
|
||||
|
||||
struct device_node {
|
||||
char *name;
|
||||
char *type;
|
||||
phandle node;
|
||||
phandle linux_phandle;
|
||||
int n_intrs;
|
||||
struct interrupt_info *intrs;
|
||||
char *path_component_name;
|
||||
char *full_name;
|
||||
|
||||
struct property *properties;
|
||||
struct property *deadprops; /* removed properties */
|
||||
struct device_node *parent;
|
||||
struct device_node *child;
|
||||
struct device_node *sibling;
|
||||
struct device_node *next; /* next device of same type */
|
||||
struct device_node *allnext; /* next in list of all nodes */
|
||||
struct proc_dir_entry *pde; /* this node's proc directory */
|
||||
struct kref kref;
|
||||
unsigned long _flags;
|
||||
void *data;
|
||||
};
|
||||
|
||||
static inline void set_node_proc_entry(struct device_node *dn, struct proc_dir_entry *de)
|
||||
{
|
||||
dn->pde = de;
|
||||
}
|
||||
|
||||
extern struct device_node *of_find_node_by_name(struct device_node *from,
|
||||
const char *name);
|
||||
#define for_each_node_by_name(dn, name) \
|
||||
for (dn = of_find_node_by_name(NULL, name); dn; \
|
||||
dn = of_find_node_by_name(dn, name))
|
||||
extern struct device_node *of_find_node_by_type(struct device_node *from,
|
||||
const char *type);
|
||||
#define for_each_node_by_type(dn, type) \
|
||||
for (dn = of_find_node_by_type(NULL, type); dn; \
|
||||
dn = of_find_node_by_type(dn, type))
|
||||
extern struct device_node *of_find_compatible_node(struct device_node *from,
|
||||
const char *type, const char *compat);
|
||||
extern struct device_node *of_find_node_by_path(const char *path);
|
||||
extern struct device_node *of_find_node_by_phandle(phandle handle);
|
||||
extern struct device_node *of_get_parent(const struct device_node *node);
|
||||
extern struct device_node *of_get_next_child(const struct device_node *node,
|
||||
struct device_node *prev);
|
||||
extern struct property *of_find_property(struct device_node *np,
|
||||
const char *name,
|
||||
int *lenp);
|
||||
extern int of_device_is_compatible(struct device_node *device, const char *);
|
||||
extern void *of_get_property(struct device_node *node, const char *name,
|
||||
int *lenp);
|
||||
extern int of_getintprop_default(struct device_node *np,
|
||||
const char *name,
|
||||
int def);
|
||||
|
||||
extern void prom_build_devicetree(void);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _SPARC_PROM_H */
|
||||
@@ -11,7 +11,8 @@
|
||||
#include <linux/ioport.h>
|
||||
|
||||
#include <asm/oplib.h>
|
||||
/* #include <asm/iommu.h> */ /* Unused since we use opaque iommu (|io-unit) */
|
||||
#include <asm/prom.h>
|
||||
#include <asm/of_device.h>
|
||||
#include <asm/scatterlist.h>
|
||||
|
||||
/* We scan which devices are on the SBus using the PROM node device
|
||||
@@ -42,18 +43,19 @@ struct sbus_bus;
|
||||
|
||||
/* Linux SBUS device tables */
|
||||
struct sbus_dev {
|
||||
struct sbus_bus *bus; /* Back ptr to sbus */
|
||||
struct sbus_dev *next; /* next device on this SBus or null */
|
||||
struct sbus_dev *child; /* For ledma and espdma on sun4m */
|
||||
struct sbus_dev *parent; /* Parent device if not toplevel */
|
||||
int prom_node; /* PROM device tree node for this device */
|
||||
char prom_name[64]; /* PROM device name */
|
||||
struct of_device ofdev;
|
||||
struct sbus_bus *bus;
|
||||
struct sbus_dev *next;
|
||||
struct sbus_dev *child;
|
||||
struct sbus_dev *parent;
|
||||
int prom_node;
|
||||
char prom_name[64];
|
||||
int slot;
|
||||
|
||||
struct resource resource[PROMREG_MAX];
|
||||
|
||||
struct linux_prom_registers reg_addrs[PROMREG_MAX];
|
||||
int num_registers, ranges_applied;
|
||||
int num_registers;
|
||||
|
||||
struct linux_prom_ranges device_ranges[PROMREG_MAX];
|
||||
int num_device_ranges;
|
||||
@@ -61,9 +63,11 @@ struct sbus_dev {
|
||||
unsigned int irqs[4];
|
||||
int num_irqs;
|
||||
};
|
||||
#define to_sbus_device(d) container_of(d, struct sbus_dev, ofdev.dev)
|
||||
|
||||
/* This struct describes the SBus(s) found on this machine. */
|
||||
struct sbus_bus {
|
||||
struct of_device ofdev;
|
||||
void *iommu; /* Opaque IOMMU cookie */
|
||||
struct sbus_dev *devices; /* Link to devices on this SBus */
|
||||
struct sbus_bus *next; /* next SBus, if more than one SBus */
|
||||
@@ -77,6 +81,7 @@ struct sbus_bus {
|
||||
int devid;
|
||||
int board;
|
||||
};
|
||||
#define to_sbus(d) container_of(d, struct sbus_bus, ofdev.dev)
|
||||
|
||||
extern struct sbus_bus *sbus_root;
|
||||
|
||||
@@ -102,6 +107,7 @@ sbus_is_slave(struct sbus_dev *dev)
|
||||
#define sbus_can_dma_64bit(sdev) (0) /* actually, sparc_cpu_model==sun4d */
|
||||
#define sbus_can_burst64(sdev) (0) /* actually, sparc_cpu_model==sun4d */
|
||||
extern void sbus_set_sbus64(struct sbus_dev *, int);
|
||||
extern void sbus_fill_device_irq(struct sbus_dev *);
|
||||
|
||||
/* These yield IOMMU mappings in consistent mode. */
|
||||
extern void *sbus_alloc_consistent(struct sbus_dev *, long, u32 *dma_addrp);
|
||||
@@ -139,4 +145,10 @@ extern void sbus_dma_sync_sg_for_device(struct sbus_dev *, struct scatterlist *,
|
||||
BTFIXUPDEF_CALL(unsigned int, sbint_to_irq, struct sbus_dev *sdev, unsigned int)
|
||||
#define sbint_to_irq(sdev, sbint) BTFIXUP_CALL(sbint_to_irq)(sdev, sbint)
|
||||
|
||||
extern void sbus_arch_bus_ranges_init(struct device_node *, struct sbus_bus *);
|
||||
extern void sbus_setup_iommu(struct sbus_bus *, struct device_node *);
|
||||
extern void sbus_setup_arch_props(struct sbus_bus *, struct device_node *);
|
||||
extern int sbus_arch_preinit(void);
|
||||
extern void sbus_arch_postinit(void);
|
||||
|
||||
#endif /* !(_SPARC_SBUS_H) */
|
||||
|
||||
@@ -10,13 +10,14 @@
|
||||
|
||||
#include <asm/pbm.h>
|
||||
#include <asm/oplib.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/of_device.h>
|
||||
|
||||
struct linux_ebus_child {
|
||||
struct linux_ebus_child *next;
|
||||
struct linux_ebus_device *parent;
|
||||
struct linux_ebus *bus;
|
||||
int prom_node;
|
||||
char prom_name[64];
|
||||
struct device_node *prom_node;
|
||||
struct resource resource[PROMREG_MAX];
|
||||
int num_addrs;
|
||||
unsigned int irqs[PROMINTR_MAX];
|
||||
@@ -24,32 +25,29 @@ struct linux_ebus_child {
|
||||
};
|
||||
|
||||
struct linux_ebus_device {
|
||||
struct of_device ofdev;
|
||||
struct linux_ebus_device *next;
|
||||
struct linux_ebus_child *children;
|
||||
struct linux_ebus *bus;
|
||||
int prom_node;
|
||||
char prom_name[64];
|
||||
struct device_node *prom_node;
|
||||
struct resource resource[PROMREG_MAX];
|
||||
int num_addrs;
|
||||
unsigned int irqs[PROMINTR_MAX];
|
||||
int num_irqs;
|
||||
};
|
||||
#define to_ebus_device(d) container_of(d, struct linux_ebus_device, ofdev.dev)
|
||||
|
||||
struct linux_ebus {
|
||||
struct of_device ofdev;
|
||||
struct linux_ebus *next;
|
||||
struct linux_ebus_device *devices;
|
||||
struct pci_pbm_info *parent;
|
||||
struct pci_dev *self;
|
||||
int index;
|
||||
int is_rio;
|
||||
int prom_node;
|
||||
char prom_name[64];
|
||||
struct linux_prom_ebus_ranges ebus_ranges[PROMREG_MAX];
|
||||
int num_ebus_ranges;
|
||||
struct linux_prom_ebus_intmap ebus_intmap[PROMREG_MAX];
|
||||
int num_ebus_intmap;
|
||||
struct linux_prom_ebus_intmask ebus_intmask;
|
||||
struct device_node *prom_node;
|
||||
};
|
||||
#define to_ebus(d) container_of(d, struct linux_ebus, ofdev.dev)
|
||||
|
||||
struct ebus_dma_info {
|
||||
spinlock_t lock;
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <linux/timer.h>
|
||||
|
||||
#include <asm/oplib.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/upa.h>
|
||||
|
||||
struct linux_fhc;
|
||||
@@ -34,8 +35,7 @@ struct linux_central {
|
||||
unsigned long clkregs;
|
||||
unsigned long clkver;
|
||||
int slots;
|
||||
int prom_node;
|
||||
char prom_name[64];
|
||||
struct device_node *prom_node;
|
||||
|
||||
struct linux_prom_ranges central_ranges[PROMREG_MAX];
|
||||
int num_central_ranges;
|
||||
@@ -112,8 +112,7 @@ struct linux_fhc {
|
||||
struct fhc_regs fhc_regs;
|
||||
int board;
|
||||
int jtag_master;
|
||||
int prom_node;
|
||||
char prom_name[64];
|
||||
struct device_node *prom_node;
|
||||
|
||||
struct linux_prom_ranges fhc_ranges[PROMREG_MAX];
|
||||
int num_fhc_ranges;
|
||||
|
||||
@@ -498,15 +498,14 @@ static int sun_pci_fd_test_drive(unsigned long port, int drive)
|
||||
#ifdef CONFIG_PCI
|
||||
static int __init ebus_fdthree_p(struct linux_ebus_device *edev)
|
||||
{
|
||||
if (!strcmp(edev->prom_name, "fdthree"))
|
||||
if (!strcmp(edev->prom_node->name, "fdthree"))
|
||||
return 1;
|
||||
if (!strcmp(edev->prom_name, "floppy")) {
|
||||
char compat[16];
|
||||
prom_getstring(edev->prom_node,
|
||||
"compatible",
|
||||
compat, sizeof(compat));
|
||||
compat[15] = '\0';
|
||||
if (!strcmp(compat, "fdthree"))
|
||||
if (!strcmp(edev->prom_node->name, "floppy")) {
|
||||
char *compat;
|
||||
|
||||
compat = of_get_property(edev->prom_node,
|
||||
"compatible", NULL);
|
||||
if (compat && !strcmp(compat, "fdthree"))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
@@ -524,12 +523,12 @@ static unsigned long __init isa_floppy_init(void)
|
||||
|
||||
for_each_isa(isa_br) {
|
||||
for_each_isadev(isa_dev, isa_br) {
|
||||
if (!strcmp(isa_dev->prom_name, "dma")) {
|
||||
if (!strcmp(isa_dev->prom_node->name, "dma")) {
|
||||
struct sparc_isa_device *child =
|
||||
isa_dev->child;
|
||||
|
||||
while (child) {
|
||||
if (!strcmp(child->prom_name,
|
||||
if (!strcmp(child->prom_node->name,
|
||||
"floppy")) {
|
||||
isa_dev = child;
|
||||
goto isa_done;
|
||||
@@ -614,6 +613,7 @@ static unsigned long __init sun_floppy_init(void)
|
||||
struct linux_ebus_device *edev = NULL;
|
||||
unsigned long config = 0;
|
||||
void __iomem *auxio_reg;
|
||||
char *state_prop;
|
||||
|
||||
for_each_ebus(ebus) {
|
||||
for_each_ebusdev(edev, ebus) {
|
||||
@@ -630,9 +630,8 @@ static unsigned long __init sun_floppy_init(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
prom_getproperty(edev->prom_node, "status",
|
||||
state, sizeof(state));
|
||||
if (!strncmp(state, "disabled", 8))
|
||||
state_prop = of_get_property(edev->prom_node, "status", NULL);
|
||||
if (state_prop && !strncmp(state_prop, "disabled", 8))
|
||||
return 0;
|
||||
|
||||
FLOPPY_IRQ = edev->irqs[0];
|
||||
@@ -703,7 +702,7 @@ static unsigned long __init sun_floppy_init(void)
|
||||
*/
|
||||
for_each_ebus(ebus) {
|
||||
for_each_ebusdev(edev, ebus) {
|
||||
if (!strcmp(edev->prom_name, "ecpp")) {
|
||||
if (!strcmp(edev->prom_node->name, "ecpp")) {
|
||||
config = edev->resource[1].start;
|
||||
goto config_done;
|
||||
}
|
||||
|
||||
@@ -9,37 +9,32 @@
|
||||
|
||||
#include <asm/pbm.h>
|
||||
#include <asm/oplib.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/of_device.h>
|
||||
|
||||
struct sparc_isa_bridge;
|
||||
|
||||
struct sparc_isa_device {
|
||||
struct of_device ofdev;
|
||||
struct sparc_isa_device *next;
|
||||
struct sparc_isa_device *child;
|
||||
struct sparc_isa_bridge *bus;
|
||||
int prom_node;
|
||||
char prom_name[64];
|
||||
char compatible[64];
|
||||
struct device_node *prom_node;
|
||||
struct resource resource;
|
||||
unsigned int irq;
|
||||
};
|
||||
#define to_isa_device(d) container_of(d, struct sparc_isa_device, ofdev.dev)
|
||||
|
||||
struct sparc_isa_bridge {
|
||||
struct of_device ofdev;
|
||||
struct sparc_isa_bridge *next;
|
||||
struct sparc_isa_device *devices;
|
||||
struct pci_pbm_info *parent;
|
||||
struct pci_dev *self;
|
||||
int index;
|
||||
int prom_node;
|
||||
char prom_name[64];
|
||||
#define linux_prom_isa_ranges linux_prom_ebus_ranges
|
||||
struct linux_prom_isa_ranges isa_ranges[PROMREG_MAX];
|
||||
int num_isa_ranges;
|
||||
#define linux_prom_isa_intmap linux_prom_ebus_intmap
|
||||
struct linux_prom_isa_intmap isa_intmap[PROMREG_MAX];
|
||||
int num_isa_intmap;
|
||||
#define linux_prom_isa_intmask linux_prom_ebus_intmask
|
||||
struct linux_prom_isa_intmap isa_intmask;
|
||||
struct device_node *prom_node;
|
||||
};
|
||||
#define to_isa_bridge(d) container_of(d, struct sparc_isa_bridge, ofdev.dev)
|
||||
|
||||
extern struct sparc_isa_bridge *isa_chain;
|
||||
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
#ifndef _ASM_SPARC64_OF_DEVICE_H
|
||||
#define _ASM_SPARC64_OF_DEVICE_H
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <asm/prom.h>
|
||||
|
||||
extern struct bus_type isa_bus_type;
|
||||
extern struct bus_type ebus_bus_type;
|
||||
extern struct bus_type sbus_bus_type;
|
||||
|
||||
/*
|
||||
* 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_node *node; /* OF device node */
|
||||
struct device dev; /* Generic device interface */
|
||||
};
|
||||
#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 of_device *dev);
|
||||
|
||||
extern struct of_device *of_dev_get(struct of_device *dev);
|
||||
extern void of_dev_put(struct of_device *dev);
|
||||
|
||||
/*
|
||||
* An of_platform_driver driver is attached to a basic of_device on
|
||||
* the ISA, EBUS, and SBUS busses on sparc64.
|
||||
*/
|
||||
struct of_platform_driver
|
||||
{
|
||||
char *name;
|
||||
struct of_device_id *match_table;
|
||||
struct module *owner;
|
||||
|
||||
int (*probe)(struct of_device* dev, const struct of_device_id *match);
|
||||
int (*remove)(struct of_device* dev);
|
||||
|
||||
int (*suspend)(struct of_device* dev, pm_message_t state);
|
||||
int (*resume)(struct of_device* dev);
|
||||
int (*shutdown)(struct of_device* dev);
|
||||
|
||||
struct device_driver driver;
|
||||
};
|
||||
#define to_of_platform_driver(drv) container_of(drv,struct of_platform_driver, driver)
|
||||
|
||||
extern int of_register_driver(struct of_platform_driver *drv,
|
||||
struct bus_type *bus);
|
||||
extern void of_unregister_driver(struct of_platform_driver *drv);
|
||||
extern int of_device_register(struct of_device *ofdev);
|
||||
extern void of_device_unregister(struct of_device *ofdev);
|
||||
extern struct of_device *of_platform_device_create(struct device_node *np,
|
||||
const char *bus_id,
|
||||
struct device *parent,
|
||||
struct bus_type *bus);
|
||||
extern void of_release_dev(struct device *dev);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_SPARC64_OF_DEVICE_H */
|
||||
@@ -323,8 +323,9 @@ extern int prom_pathtoinode(const char *path);
|
||||
extern int prom_inst2pkg(int);
|
||||
|
||||
/* CPU probing helpers. */
|
||||
int cpu_find_by_instance(int instance, int *prom_node, int *mid);
|
||||
int cpu_find_by_mid(int mid, int *prom_node);
|
||||
struct device_node;
|
||||
int cpu_find_by_instance(int instance, struct device_node **dev_node, int *mid);
|
||||
int cpu_find_by_mid(int mid, struct device_node **prom_node);
|
||||
|
||||
/* Client interface level routines. */
|
||||
extern void prom_set_trap_table(unsigned long tba);
|
||||
|
||||
@@ -67,18 +67,17 @@ static __inline__ unsigned int get_dma_residue(unsigned int dmanr)
|
||||
|
||||
static int ebus_ecpp_p(struct linux_ebus_device *edev)
|
||||
{
|
||||
if (!strcmp(edev->prom_name, "ecpp"))
|
||||
if (!strcmp(edev->prom_node->name, "ecpp"))
|
||||
return 1;
|
||||
if (!strcmp(edev->prom_name, "parallel")) {
|
||||
char compat[19];
|
||||
prom_getstring(edev->prom_node,
|
||||
"compatible",
|
||||
compat, sizeof(compat));
|
||||
compat[18] = '\0';
|
||||
if (!strcmp(compat, "ecpp"))
|
||||
return 1;
|
||||
if (!strcmp(compat, "ns87317-ecpp") &&
|
||||
!strcmp(compat + 13, "ecpp"))
|
||||
if (!strcmp(edev->prom_node->name, "parallel")) {
|
||||
char *compat;
|
||||
|
||||
compat = of_get_property(edev->prom_node,
|
||||
"compatible", NULL);
|
||||
if (compat &&
|
||||
(!strcmp(compat, "ecpp") ||
|
||||
!strcmp(compat, "ns87317-ecpp") ||
|
||||
!strcmp(compat + 13, "ecpp")))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
@@ -94,12 +93,12 @@ static int parport_isa_probe(int count)
|
||||
struct sparc_isa_device *child;
|
||||
unsigned long base;
|
||||
|
||||
if (strcmp(isa_dev->prom_name, "dma"))
|
||||
if (strcmp(isa_dev->prom_node->name, "dma"))
|
||||
continue;
|
||||
|
||||
child = isa_dev->child;
|
||||
while (child) {
|
||||
if (!strcmp(child->prom_name, "parallel"))
|
||||
if (!strcmp(child->prom_node->name, "parallel"))
|
||||
break;
|
||||
child = child->next;
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <asm/io.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/oplib.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/iommu.h>
|
||||
|
||||
/* The abstraction used here is that there are PCI controllers,
|
||||
@@ -153,16 +154,15 @@ struct pci_pbm_info {
|
||||
int chip_revision;
|
||||
|
||||
/* Name used for top-level resources. */
|
||||
char name[64];
|
||||
char *name;
|
||||
|
||||
/* OBP specific information. */
|
||||
int prom_node;
|
||||
char prom_name[64];
|
||||
struct linux_prom_pci_ranges pbm_ranges[PROM_PCIRNG_MAX];
|
||||
struct device_node *prom_node;
|
||||
struct linux_prom_pci_ranges *pbm_ranges;
|
||||
int num_pbm_ranges;
|
||||
struct linux_prom_pci_intmap pbm_intmap[PROM_PCIIMAP_MAX];
|
||||
struct linux_prom_pci_intmap *pbm_intmap;
|
||||
int num_pbm_intmap;
|
||||
struct linux_prom_pci_intmask pbm_intmask;
|
||||
struct linux_prom_pci_intmask *pbm_intmask;
|
||||
u64 ino_bitmap;
|
||||
|
||||
/* PBM I/O and Memory space resources. */
|
||||
@@ -227,8 +227,7 @@ struct pci_controller_info {
|
||||
*/
|
||||
struct pcidev_cookie {
|
||||
struct pci_pbm_info *pbm;
|
||||
char prom_name[64];
|
||||
int prom_node;
|
||||
struct device_node *prom_node;
|
||||
struct linux_prom_pci_registers prom_regs[PROMREG_MAX];
|
||||
int num_prom_regs;
|
||||
struct linux_prom_pci_registers prom_assignments[PROMREG_MAX];
|
||||
|
||||
@@ -756,6 +756,8 @@ extern unsigned long *sparc64_valid_addr_bitmap;
|
||||
#define kern_addr_valid(addr) \
|
||||
(test_bit(__pa((unsigned long)(addr))>>22, sparc64_valid_addr_bitmap))
|
||||
|
||||
extern int page_in_phys_avail(unsigned long paddr);
|
||||
|
||||
extern int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long from,
|
||||
unsigned long pfn,
|
||||
unsigned long size, pgprot_t prot);
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
#ifndef _SPARC64_PROM_H
|
||||
#define _SPARC64_PROM_H
|
||||
#ifdef __KERNEL__
|
||||
|
||||
|
||||
/*
|
||||
* Definitions for talking to the Open Firmware PROM on
|
||||
* Power Macintosh computers.
|
||||
*
|
||||
* Copyright (C) 1996-2005 Paul Mackerras.
|
||||
*
|
||||
* Updates for PPC64 by Peter Bergner & David Engebretsen, IBM Corp.
|
||||
* Updates for SPARC64 by David S. Miller
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <asm/atomic.h>
|
||||
|
||||
typedef u32 phandle;
|
||||
typedef u32 ihandle;
|
||||
|
||||
struct interrupt_info {
|
||||
int line;
|
||||
int sense; /* +ve/-ve logic, edge or level, etc. */
|
||||
};
|
||||
|
||||
struct property {
|
||||
char *name;
|
||||
int length;
|
||||
void *value;
|
||||
struct property *next;
|
||||
};
|
||||
|
||||
struct device_node {
|
||||
char *name;
|
||||
char *type;
|
||||
phandle node;
|
||||
phandle linux_phandle;
|
||||
int n_intrs;
|
||||
struct interrupt_info *intrs;
|
||||
char *path_component_name;
|
||||
char *full_name;
|
||||
|
||||
struct property *properties;
|
||||
struct property *deadprops; /* removed properties */
|
||||
struct device_node *parent;
|
||||
struct device_node *child;
|
||||
struct device_node *sibling;
|
||||
struct device_node *next; /* next device of same type */
|
||||
struct device_node *allnext; /* next in list of all nodes */
|
||||
struct proc_dir_entry *pde; /* this node's proc directory */
|
||||
struct kref kref;
|
||||
unsigned long _flags;
|
||||
void *data;
|
||||
};
|
||||
|
||||
static inline void set_node_proc_entry(struct device_node *dn, struct proc_dir_entry *de)
|
||||
{
|
||||
dn->pde = de;
|
||||
}
|
||||
|
||||
extern struct device_node *of_find_node_by_name(struct device_node *from,
|
||||
const char *name);
|
||||
#define for_each_node_by_name(dn, name) \
|
||||
for (dn = of_find_node_by_name(NULL, name); dn; \
|
||||
dn = of_find_node_by_name(dn, name))
|
||||
extern struct device_node *of_find_node_by_type(struct device_node *from,
|
||||
const char *type);
|
||||
#define for_each_node_by_type(dn, type) \
|
||||
for (dn = of_find_node_by_type(NULL, type); dn; \
|
||||
dn = of_find_node_by_type(dn, type))
|
||||
extern struct device_node *of_find_compatible_node(struct device_node *from,
|
||||
const char *type, const char *compat);
|
||||
extern struct device_node *of_find_node_by_path(const char *path);
|
||||
extern struct device_node *of_find_node_by_phandle(phandle handle);
|
||||
extern struct device_node *of_get_parent(const struct device_node *node);
|
||||
extern struct device_node *of_get_next_child(const struct device_node *node,
|
||||
struct device_node *prev);
|
||||
extern struct property *of_find_property(struct device_node *np,
|
||||
const char *name,
|
||||
int *lenp);
|
||||
extern int of_device_is_compatible(struct device_node *device, const char *);
|
||||
extern void *of_get_property(struct device_node *node, const char *name,
|
||||
int *lenp);
|
||||
extern int of_getintprop_default(struct device_node *np,
|
||||
const char *name,
|
||||
int def);
|
||||
|
||||
extern void prom_build_devicetree(void);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _SPARC64_PROM_H */
|
||||
@@ -11,6 +11,8 @@
|
||||
#include <linux/ioport.h>
|
||||
|
||||
#include <asm/oplib.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/of_device.h>
|
||||
#include <asm/iommu.h>
|
||||
#include <asm/scatterlist.h>
|
||||
|
||||
@@ -42,18 +44,19 @@ struct sbus_bus;
|
||||
|
||||
/* Linux SBUS device tables */
|
||||
struct sbus_dev {
|
||||
struct sbus_bus *bus; /* Our toplevel parent SBUS */
|
||||
struct sbus_dev *next; /* Chain of siblings */
|
||||
struct sbus_dev *child; /* Chain of children */
|
||||
struct sbus_dev *parent;/* Parent device if not toplevel*/
|
||||
int prom_node; /* OBP node of this device */
|
||||
char prom_name[64]; /* OBP device name property */
|
||||
int slot; /* SBUS slot number */
|
||||
struct of_device ofdev;
|
||||
struct sbus_bus *bus;
|
||||
struct sbus_dev *next;
|
||||
struct sbus_dev *child;
|
||||
struct sbus_dev *parent;
|
||||
int prom_node;
|
||||
char prom_name[64];
|
||||
int slot;
|
||||
|
||||
struct resource resource[PROMREG_MAX];
|
||||
|
||||
struct linux_prom_registers reg_addrs[PROMREG_MAX];
|
||||
int num_registers, ranges_applied;
|
||||
int num_registers;
|
||||
|
||||
struct linux_prom_ranges device_ranges[PROMREG_MAX];
|
||||
int num_device_ranges;
|
||||
@@ -61,9 +64,11 @@ struct sbus_dev {
|
||||
unsigned int irqs[4];
|
||||
int num_irqs;
|
||||
};
|
||||
#define to_sbus_device(d) container_of(d, struct sbus_dev, ofdev.dev)
|
||||
|
||||
/* This struct describes the SBus(s) found on this machine. */
|
||||
struct sbus_bus {
|
||||
struct of_device ofdev;
|
||||
void *iommu; /* Opaque IOMMU cookie */
|
||||
struct sbus_dev *devices; /* Tree of SBUS devices */
|
||||
struct sbus_bus *next; /* Next SBUS in system */
|
||||
@@ -77,6 +82,7 @@ struct sbus_bus {
|
||||
int portid;
|
||||
void *starfire_cookie;
|
||||
};
|
||||
#define to_sbus(d) container_of(d, struct sbus_bus, ofdev.dev)
|
||||
|
||||
extern struct sbus_bus *sbus_root;
|
||||
|
||||
@@ -95,6 +101,7 @@ extern struct sbus_bus *sbus_root;
|
||||
#define sbus_can_dma_64bit(sdev) (1)
|
||||
#define sbus_can_burst64(sdev) (1)
|
||||
extern void sbus_set_sbus64(struct sbus_dev *, int);
|
||||
extern void sbus_fill_device_irq(struct sbus_dev *);
|
||||
|
||||
/* These yield IOMMU mappings in consistent mode. */
|
||||
extern void *sbus_alloc_consistent(struct sbus_dev *, size_t, dma_addr_t *dma_addrp);
|
||||
@@ -119,4 +126,10 @@ extern void sbus_dma_sync_sg_for_cpu(struct sbus_dev *, struct scatterlist *, in
|
||||
#define sbus_dma_sync_sg sbus_dma_sync_sg_for_cpu
|
||||
extern void sbus_dma_sync_sg_for_device(struct sbus_dev *, struct scatterlist *, int, int);
|
||||
|
||||
extern void sbus_arch_bus_ranges_init(struct device_node *, struct sbus_bus *);
|
||||
extern void sbus_setup_iommu(struct sbus_bus *, struct device_node *);
|
||||
extern void sbus_setup_arch_props(struct sbus_bus *, struct device_node *);
|
||||
extern int sbus_arch_preinit(void);
|
||||
extern void sbus_arch_postinit(void);
|
||||
|
||||
#endif /* !(_SPARC64_SBUS_H) */
|
||||
|
||||
@@ -7,10 +7,11 @@
|
||||
#define _SPARC64_VDEV_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <asm/prom.h>
|
||||
|
||||
extern u32 sun4v_vdev_devhandle;
|
||||
extern int sun4v_vdev_root;
|
||||
extern struct device_node *sun4v_vdev_root;
|
||||
|
||||
extern unsigned int sun4v_vdev_device_interrupt(unsigned int);
|
||||
extern unsigned int sun4v_vdev_device_interrupt(struct device_node *dev_node);
|
||||
|
||||
#endif /* !(_SPARC64_VDEV_H) */
|
||||
|
||||
Reference in New Issue
Block a user