bcm53xx: sprom: extract for PCI host
authorRafał Miłecki <zajec5@gmail.com>
Mon, 16 Feb 2015 16:13:23 +0000 (16:13 +0000)
committerRafał Miłecki <zajec5@gmail.com>
Mon, 16 Feb 2015 16:13:23 +0000 (16:13 +0000)
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
SVN-Revision: 44464

target/linux/bcm53xx/files/drivers/misc/bcm47xx-sprom.c

index 6b3ab96749774cfd6c569a703e0a3de0bf62e0a2..a82728df91184dc9d4ef3dcc9f2916da52c70942 100644 (file)
@@ -644,6 +644,30 @@ static int bcm47xx_sprom_getenv(const struct bcm47xx_sprom_fill *fill,
 /* FIXME: This should not be static, but some callback argument */
 static struct platform_device *sprom_pdev = NULL;
 
 /* FIXME: This should not be static, but some callback argument */
 static struct platform_device *sprom_pdev = NULL;
 
+static char prefix[20];
+
+static void bcm47xx_sprom_apply_prefix_alias(char *prefix, size_t prefix_len)
+{
+       size_t needle_len = strlen(prefix) - 1;
+       char nvram_var[10];
+       char buf[20];
+       int i;
+
+       if (needle_len <= 0 || prefix[needle_len] != '/')
+               return;
+
+       for (i = 0; i < 3; i++) {
+               if (snprintf(nvram_var, sizeof(nvram_var), "devpath%d", i) <= 0)
+                       continue;
+               if (bcm47xx_nvram_getenv(nvram_var, buf, sizeof(buf)) < 0)
+                       continue;
+               if (strlen(buf) == needle_len && !strncmp(buf, prefix, needle_len)) {
+                       snprintf(prefix, prefix_len, "%d:", i);
+                       return;
+               }
+       }
+}
+
 /*
  * This function has to be called in a very precise moment. It has to be done:
  * 1) After bcma registers flash cores, so we can read NVRAM.
 /*
  * This function has to be called in a very precise moment. It has to be done:
  * 1) After bcma registers flash cores, so we can read NVRAM.
@@ -674,6 +698,13 @@ static int bcm47xx_sprom_init(struct bcma_bus *bus, struct ssb_sprom *out)
                return -ENOMEM;
 
        switch (bus->hosttype) {
                return -ENOMEM;
 
        switch (bus->hosttype) {
+       case BCMA_HOSTTYPE_PCI:
+               snprintf(prefix, sizeof(prefix), "pci/%u/%u/",
+                        pci_domain_nr(bus->host_pci->bus) + 1,
+                        bus->host_pci->bus->number);
+               bcm47xx_sprom_apply_prefix_alias(prefix, sizeof(prefix));
+               fill.prefix = prefix;
+               break;
        case BCMA_HOSTTYPE_SOC:
                fill.prefix = of_get_property(np, "prefix", NULL);
                break;
        case BCMA_HOSTTYPE_SOC:
                fill.prefix = of_get_property(np, "prefix", NULL);
                break;