Explorar el Código

bcm53xx: sprom: extract for PCI host

Signed-off-by: Rafał Miłecki <[email protected]>

SVN-Revision: 44464
Rafał Miłecki hace 11 años
padre
commit
44253d311f
Se han modificado 1 ficheros con 31 adiciones y 0 borrados
  1. 31 0
      target/linux/bcm53xx/files/drivers/misc/bcm47xx-sprom.c

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

@@ -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;
 
+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.
@@ -674,6 +698,13 @@ static int bcm47xx_sprom_init(struct bcma_bus *bus, struct ssb_sprom *out)
 		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;