[SPARC64]: Add obppath sysfs attribute for SBUS and PCI devices.

Signed-off-by: Fabio Massimo Di Nitto <fabbione@ubuntu.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Fabio Massimo Di Nitto 2006-12-20 09:22:28 -08:00 committed by David S. Miller
parent d18d7682c1
commit cf69eab231
2 changed files with 41 additions and 2 deletions

View File

@ -7,6 +7,8 @@
#include <linux/string.h> #include <linux/string.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/pci.h>
#include <linux/device.h>
#include <asm/pbm.h> #include <asm/pbm.h>
#include <asm/prom.h> #include <asm/prom.h>
@ -129,6 +131,20 @@ static void __init fixup_obp_assignments(struct pci_dev *pdev,
} }
} }
static ssize_t
show_pciobppath_attr(struct device * dev, struct device_attribute * attr, char * buf)
{
struct pci_dev *pdev;
struct pcidev_cookie *sysdata;
pdev = to_pci_dev(dev);
sysdata = pdev->sysdata;
return snprintf (buf, PAGE_SIZE, "%s\n", sysdata->prom_node->full_name);
}
static DEVICE_ATTR(obppath, S_IRUSR | S_IRGRP | S_IROTH, show_pciobppath_attr, NULL);
/* Fill in the PCI device cookie sysdata for the given /* Fill in the PCI device cookie sysdata for the given
* PCI device. This cookie is the means by which one * PCI device. This cookie is the means by which one
* can get to OBP and PCI controller specific information * can get to OBP and PCI controller specific information
@ -142,7 +158,7 @@ static void __init pdev_cookie_fillin(struct pci_pbm_info *pbm,
struct pcidev_cookie *pcp; struct pcidev_cookie *pcp;
struct device_node *dp; struct device_node *dp;
struct property *prop; struct property *prop;
int nregs, len; int nregs, len, err;
dp = find_device_prom_node(pbm, pdev, bus_node, dp = find_device_prom_node(pbm, pdev, bus_node,
&pregs, &nregs); &pregs, &nregs);
@ -215,6 +231,13 @@ static void __init pdev_cookie_fillin(struct pci_pbm_info *pbm,
fixup_obp_assignments(pdev, pcp); fixup_obp_assignments(pdev, pcp);
pdev->sysdata = pcp; pdev->sysdata = pcp;
/* we don't really care if we can create this file or not,
* but we need to assign the result of the call or the world will fall
* under alien invasion and everybody will be frozen on a spaceship
* ready to be eaten on alpha centauri by some green and jelly humanoid.
*/
err = sysfs_create_file(&pdev->dev.kobj, &dev_attr_obppath.attr);
} }
void __init pci_fill_in_pbm_cookies(struct pci_bus *pbus, void __init pci_fill_in_pbm_cookies(struct pci_bus *pbus,

View File

@ -7,6 +7,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/device.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/sbus.h> #include <asm/sbus.h>
@ -17,13 +18,25 @@
#include <asm/bpp.h> #include <asm/bpp.h>
#include <asm/irq.h> #include <asm/irq.h>
static ssize_t
show_sbusobppath_attr(struct device * dev, struct device_attribute * attr, char * buf)
{
struct sbus_dev *sbus;
sbus = to_sbus_device(dev);
return snprintf (buf, PAGE_SIZE, "%s\n", sbus->ofdev.node->full_name);
}
static DEVICE_ATTR(obppath, S_IRUSR | S_IRGRP | S_IROTH, show_sbusobppath_attr, NULL);
struct sbus_bus *sbus_root; struct sbus_bus *sbus_root;
static void __init fill_sbus_device(struct device_node *dp, struct sbus_dev *sdev) static void __init fill_sbus_device(struct device_node *dp, struct sbus_dev *sdev)
{ {
unsigned long base; unsigned long base;
void *pval; void *pval;
int len; int len, err;
sdev->prom_node = dp->node; sdev->prom_node = dp->node;
strcpy(sdev->prom_name, dp->name); strcpy(sdev->prom_name, dp->name);
@ -66,6 +79,9 @@ static void __init fill_sbus_device(struct device_node *dp, struct sbus_dev *sde
if (of_device_register(&sdev->ofdev) != 0) if (of_device_register(&sdev->ofdev) != 0)
printk(KERN_DEBUG "sbus: device registration error for %s!\n", printk(KERN_DEBUG "sbus: device registration error for %s!\n",
dp->path_component_name); dp->path_component_name);
/* WE HAVE BEEN INVADED BY ALIENS! */
err = sysfs_create_file(&sdev->ofdev.dev.kobj, &dev_attr_obppath.attr);
} }
static void __init sbus_bus_ranges_init(struct device_node *dp, struct sbus_bus *sbus) static void __init sbus_bus_ranges_init(struct device_node *dp, struct sbus_bus *sbus)