]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - lib/fdtdec.c
include/net.h: add max_speed member in struct eth_pdata
[people/ms/u-boot.git] / lib / fdtdec.c
index ae0b708ddc2ec651df7da63a369a1e9cd5010a28..1093c305266ccf34e44c2de95653975746279f2c 100644 (file)
@@ -5,6 +5,7 @@
 
 #ifndef USE_HOSTCC
 #include <common.h>
+#include <dm.h>
 #include <errno.h>
 #include <serial.h>
 #include <libfdt.h>
@@ -190,7 +191,7 @@ fdt_addr_t fdtdec_get_addr(const void *blob, int node,
        return fdtdec_get_addr_size(blob, node, prop_name, NULL);
 }
 
-#ifdef CONFIG_PCI
+#if defined(CONFIG_PCI) && defined(CONFIG_DM_PCI)
 int fdtdec_get_pci_addr(const void *blob, int node, enum fdt_pci_space type,
                const char *prop_name, struct fdt_pci_addr *addr)
 {
@@ -283,58 +284,10 @@ int fdtdec_get_pci_vendev(const void *blob, int node, u16 *vendor, u16 *device)
        return -ENOENT;
 }
 
-int fdtdec_get_pci_bdf(const void *blob, int node,
-               struct fdt_pci_addr *addr, pci_dev_t *bdf)
+int fdtdec_get_pci_bar32(struct udevice *dev, struct fdt_pci_addr *addr,
+                        u32 *bar)
 {
-       u16 dt_vendor, dt_device, vendor, device;
-       int ret;
-
-       /* get vendor id & device id from the compatible string */
-       ret = fdtdec_get_pci_vendev(blob, node, &dt_vendor, &dt_device);
-       if (ret)
-               return ret;
-
-       /* extract the bdf from fdt_pci_addr */
-       *bdf = addr->phys_hi & 0xffff00;
-
-       /* read vendor id & device id based on bdf */
-       pci_read_config_word(*bdf, PCI_VENDOR_ID, &vendor);
-       pci_read_config_word(*bdf, PCI_DEVICE_ID, &device);
-
-       /*
-        * Note there are two places in the device tree to fully describe
-        * a pci device: one is via compatible string with a format of
-        * "pciVVVV,DDDD" and the other one is the bdf numbers encoded in
-        * the device node's reg address property. We read the vendor id
-        * and device id based on bdf and compare the values with the
-        * "VVVV,DDDD". If they are the same, then we are good to use bdf
-        * to read device's bar. But if they are different, we have to rely
-        * on the vendor id and device id extracted from the compatible
-        * string and locate the real bdf by pci_find_device(). This is
-        * because normally we may only know device's device number and
-        * function number when writing device tree. The bus number is
-        * dynamically assigned during the pci enumeration process.
-        */
-       if ((dt_vendor != vendor) || (dt_device != device)) {
-               *bdf = pci_find_device(dt_vendor, dt_device, 0);
-               if (*bdf == -1)
-                       return -ENODEV;
-       }
-
-       return 0;
-}
-
-int fdtdec_get_pci_bar32(const void *blob, int node,
-               struct fdt_pci_addr *addr, u32 *bar)
-{
-       pci_dev_t bdf;
        int barnum;
-       int ret;
-
-       /* get pci devices's bdf */
-       ret = fdtdec_get_pci_bdf(blob, node, addr, &bdf);
-       if (ret)
-               return ret;
 
        /* extract the bar number from fdt_pci_addr */
        barnum = addr->phys_hi & 0xff;
@@ -342,7 +295,7 @@ int fdtdec_get_pci_bar32(const void *blob, int node,
                return -EINVAL;
 
        barnum = (barnum - PCI_BASE_ADDRESS_0) / 4;
-       *bar = pci_read_bar32(pci_bus_to_hose(PCI_BUS(bdf)), bdf, barnum);
+       *bar = dm_pci_read_bar32(dev, barnum);
 
        return 0;
 }