[PATCH] Export OF device path for PCI devices

Here's a new version of the patch according to our discussion.

This allows the platform to add its own platform files to the
sysfs PCI device node through a "pcibios_add_platform_entries()"
call.

I added an empty pcibios_add_platform_entries() inline to all
archs that apparently have PCI and implemented the OF stuff for
ppc and ppc64. The name is still "devspec" for now, I doubt
it will conflict and that's consistent with our use of the
"devspec" name in other places.
parent 6aedddb0
...@@ -1022,8 +1022,31 @@ pci_create_OF_bus_map(void) ...@@ -1022,8 +1022,31 @@ pci_create_OF_bus_map(void)
prom_add_property(find_path_device("/"), of_prop); prom_add_property(find_path_device("/"), of_prop);
} }
} }
static ssize_t pci_show_devspec(struct device *dev, char *buf)
{
struct pci_dev *pdev;
struct device_node *np;
pdev = to_pci_dev (dev);
np = pci_device_to_OF_node(pdev);
if (np == NULL || np->full_name == NULL)
return 0;
return sprintf(buf, "%s", np->full_name);
}
static DEVICE_ATTR(devspec, S_IRUGO, pci_show_devspec, NULL);
#endif /* CONFIG_PPC_OF */ #endif /* CONFIG_PPC_OF */
/* Add sysfs properties */
void pcibios_add_platform_entries(struct pci_dev *dev)
{
#ifdef CONFIG_PPC_OF
device_create_file(&pdev->dev, &dev_attr_devspec);
#endif /* CONFIG_PPC_OF */
}
#ifdef CONFIG_PPC_PMAC #ifdef CONFIG_PPC_PMAC
/* /*
* This set of routines checks for PCI<->PCI bridges that have closed * This set of routines checks for PCI<->PCI bridges that have closed
......
...@@ -540,3 +540,25 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, ...@@ -540,3 +540,25 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
return ret; return ret;
} }
#ifdef CONFIG_PPC_PSERIES
static ssize_t pci_show_devspec(struct device *dev, char *buf)
{
struct pci_dev *pdev;
struct device_node *np;
pdev = to_pci_dev (dev);
np = pci_device_to_OF_node(pdev);
if (np == NULL || np->full_name == NULL)
return 0;
return sprintf(buf, "%s", np->full_name);
}
static DEVICE_ATTR(devspec, S_IRUGO, pci_show_devspec, NULL);
#endif /* CONFIG_PPC_PSERIES */
void pcibios_add_platform_entries(struct pci_dev *pdev)
{
#ifdef CONFIG_PPC_PSERIES
device_create_file(&pdev->dev, &dev_attr_devspec);
#endif /* CONFIG_PPC_PSERIES */
}
...@@ -180,4 +180,7 @@ void pci_create_sysfs_dev_files (struct pci_dev *pdev) ...@@ -180,4 +180,7 @@ void pci_create_sysfs_dev_files (struct pci_dev *pdev)
device_create_file (dev, &dev_attr_irq); device_create_file (dev, &dev_attr_irq);
device_create_file (dev, &dev_attr_resource); device_create_file (dev, &dev_attr_resource);
sysfs_create_bin_file(&dev->kobj, &pci_config_attr); sysfs_create_bin_file(&dev->kobj, &pci_config_attr);
/* add platform-specific attributes */
pcibios_add_platform_entries(pdev);
} }
...@@ -208,6 +208,10 @@ static inline int pci_name_bus(char *name, struct pci_bus *bus) ...@@ -208,6 +208,10 @@ static inline int pci_name_bus(char *name, struct pci_bus *bus)
return 0; return 0;
} }
static inline void pcibios_add_platform_entries(struct pci_dev *dev)
{
}
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
/* Values for the `which' argument to sys_pciconfig_iobase. */ /* Values for the `which' argument to sys_pciconfig_iobase. */
......
...@@ -186,6 +186,10 @@ extern void ...@@ -186,6 +186,10 @@ extern void
pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
struct resource *res); struct resource *res);
static inline void pcibios_add_platform_entries(struct pci_dev *dev)
{
}
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif #endif
...@@ -22,4 +22,8 @@ extern inline void pcibios_penalize_isa_irq(int irq) ...@@ -22,4 +22,8 @@ extern inline void pcibios_penalize_isa_irq(int irq)
#define PCI_DMA_BUS_IS_PHYS (1) #define PCI_DMA_BUS_IS_PHYS (1)
static inline void pcibios_add_platform_entries(struct pci_dev *dev)
{
}
#endif /* _ASM_H8300_PCI_H */ #endif /* _ASM_H8300_PCI_H */
...@@ -89,6 +89,11 @@ pci_dac_dma_sync_single(struct pci_dev *pdev, dma64_addr_t dma_addr, size_t len, ...@@ -89,6 +89,11 @@ pci_dac_dma_sync_single(struct pci_dev *pdev, dma64_addr_t dma_addr, size_t len,
extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
enum pci_mmap_state mmap_state, int write_combine); enum pci_mmap_state mmap_state, int write_combine);
static inline void pcibios_add_platform_entries(struct pci_dev *dev)
{
}
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
/* implement the pci_ DMA API in terms of the generic device dma_ one */ /* implement the pci_ DMA API in terms of the generic device dma_ one */
......
...@@ -112,6 +112,10 @@ static inline int pci_name_bus(char *name, struct pci_bus *bus) ...@@ -112,6 +112,10 @@ static inline int pci_name_bus(char *name, struct pci_bus *bus)
return 0; return 0;
} }
static inline void pcibios_add_platform_entries(struct pci_dev *dev)
{
}
/* generic pci stuff */ /* generic pci stuff */
#include <asm-generic/pci.h> #include <asm-generic/pci.h>
......
...@@ -54,4 +54,8 @@ static inline void pcibios_penalize_isa_irq(int irq) ...@@ -54,4 +54,8 @@ static inline void pcibios_penalize_isa_irq(int irq)
*/ */
#define PCI_DMA_BUS_IS_PHYS (1) #define PCI_DMA_BUS_IS_PHYS (1)
static inline void pcibios_add_platform_entries(struct pci_dev *dev)
{
}
#endif /* _ASM_M68K_PCI_H */ #endif /* _ASM_M68K_PCI_H */
...@@ -30,6 +30,10 @@ static inline int pci_dma_supported(struct pci_dev *hwdev, u64 mask) ...@@ -30,6 +30,10 @@ static inline int pci_dma_supported(struct pci_dev *hwdev, u64 mask)
*/ */
#define pci_dac_dma_supported(pci_dev, mask) (0) #define pci_dac_dma_supported(pci_dev, mask) (0)
static inline void pcibios_add_platform_entries(struct pci_dev *dev)
{
}
#endif /* CONFIG_COMEMPCI */ #endif /* CONFIG_COMEMPCI */
#endif /* M68KNOMMU_PCI_H */ #endif /* M68KNOMMU_PCI_H */
...@@ -120,6 +120,10 @@ static inline void pci_dac_dma_sync_single(struct pci_dev *pdev, ...@@ -120,6 +120,10 @@ static inline void pci_dac_dma_sync_single(struct pci_dev *pdev,
dma_cache_wback_inv(addr, len); dma_cache_wback_inv(addr, len);
} }
static inline void pcibios_add_platform_entries(struct pci_dev *dev)
{
}
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
/* implement the pci_ DMA API in terms of the generic device dma_ one */ /* implement the pci_ DMA API in terms of the generic device dma_ one */
......
...@@ -196,4 +196,8 @@ extern void ...@@ -196,4 +196,8 @@ extern void
pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
struct resource *res); struct resource *res);
static inline void pcibios_add_platform_entries(struct pci_dev *dev)
{
}
#endif /* __ASM_PARISC_PCI_H */ #endif /* __ASM_PARISC_PCI_H */
...@@ -282,6 +282,8 @@ extern void ...@@ -282,6 +282,8 @@ extern void
pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
struct resource *res); struct resource *res);
extern void pcibios_add_platform_entries(struct pci_dev *dev);
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* __PPC_PCI_H */ #endif /* __PPC_PCI_H */
...@@ -152,6 +152,8 @@ pcibios_fixup_device_resources(struct pci_dev *dev, struct pci_bus *bus); ...@@ -152,6 +152,8 @@ pcibios_fixup_device_resources(struct pci_dev *dev, struct pci_bus *bus);
extern int pci_read_irq_line(struct pci_dev *dev); extern int pci_read_irq_line(struct pci_dev *dev);
extern void pcibios_add_platform_entries(struct pci_dev *dev);
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* __PPC64_PCI_H */ #endif /* __PPC64_PCI_H */
...@@ -256,6 +256,10 @@ extern void pcibios_fixup_irqs(void); ...@@ -256,6 +256,10 @@ extern void pcibios_fixup_irqs(void);
extern int pciauto_assign_resources(int busno, struct pci_channel *hose); extern int pciauto_assign_resources(int busno, struct pci_channel *hose);
#endif #endif
static inline void pcibios_add_platform_entries(struct pci_dev *dev)
{
}
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
/* generic pci stuff */ /* generic pci stuff */
......
...@@ -141,6 +141,10 @@ extern inline int pci_dma_supported(struct pci_dev *hwdev, u64 mask) ...@@ -141,6 +141,10 @@ extern inline int pci_dma_supported(struct pci_dev *hwdev, u64 mask)
#define pci_dac_dma_supported(dev, mask) (0) #define pci_dac_dma_supported(dev, mask) (0)
static inline void pcibios_add_platform_entries(struct pci_dev *dev)
{
}
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
/* generic pci stuff */ /* generic pci stuff */
......
...@@ -215,6 +215,10 @@ extern void ...@@ -215,6 +215,10 @@ extern void
pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
struct pci_bus_region *region); struct pci_bus_region *region);
static inline void pcibios_add_platform_entries(struct pci_dev *dev)
{
}
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* __SPARC64_PCI_H */ #endif /* __SPARC64_PCI_H */
...@@ -76,4 +76,8 @@ extern void ...@@ -76,4 +76,8 @@ extern void
pci_free_consistent (struct pci_dev *pdev, size_t size, void *cpu_addr, pci_free_consistent (struct pci_dev *pdev, size_t size, void *cpu_addr,
dma_addr_t dma_addr); dma_addr_t dma_addr);
static inline void pcibios_add_platform_entries(struct pci_dev *dev)
{
}
#endif /* __V850_PCI_H__ */ #endif /* __V850_PCI_H__ */
...@@ -263,6 +263,10 @@ pci_dac_dma_sync_single(struct pci_dev *pdev, dma64_addr_t dma_addr, size_t len, ...@@ -263,6 +263,10 @@ pci_dac_dma_sync_single(struct pci_dev *pdev, dma64_addr_t dma_addr, size_t len,
extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
enum pci_mmap_state mmap_state, int write_combine); enum pci_mmap_state mmap_state, int write_combine);
static inline void pcibios_add_platform_entries(struct pci_dev *dev)
{
}
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
/* generic pci stuff */ /* generic pci stuff */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment