]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
net: dwc_eth_qos: Adapt probe() for PCI devices
authorPhilip Oberfichtner <pro@denx.de>
Fri, 2 Aug 2024 09:25:37 +0000 (11:25 +0200)
committerTom Rini <trini@konsulko.com>
Tue, 3 Sep 2024 15:12:00 +0000 (09:12 -0600)
PCI devices do not necessarily use a device tree. In that case, the
driver currently fails to find eqos->config and eqos->regs.

This commit factors out the respective functionality. Device tree usage
remains default, but board specific implementations will be possible as
well.

Signed-off-by: Philip Oberfichtner <pro@denx.de>
drivers/net/dwc_eth_qos.c
drivers/net/dwc_eth_qos.h
drivers/net/dwc_eth_qos_imx.c
drivers/net/dwc_eth_qos_qcom.c
drivers/net/dwc_eth_qos_rockchip.c
drivers/net/dwc_eth_qos_starfive.c
drivers/net/dwc_eth_qos_stm32.c

index 43f0ec7637d803a650a2f98194b60728b75e7ca1..203c86c6cf1ab13e2991615f13b049b21b6ccaed 100644 (file)
@@ -32,6 +32,7 @@
 #include <clk.h>
 #include <cpu_func.h>
 #include <dm.h>
+#include <dm/device_compat.h>
 #include <errno.h>
 #include <eth_phy.h>
 #include <log.h>
@@ -1301,6 +1302,13 @@ static int eqos_probe_resources_tegra186(struct udevice *dev)
 
        debug("%s(dev=%p):\n", __func__, dev);
 
+       ret = eqos_get_base_addr_dt(dev);
+       if (ret) {
+               pr_err("eqos_get_base_addr_dt failed: %d\n", ret);
+               return ret;
+       }
+       eqos->tegra186_regs = (void *)(eqos->regs + EQOS_TEGRA186_REGS_BASE);
+
        ret = reset_get_by_name(dev, "eqos", &eqos->reset_ctl);
        if (ret) {
                pr_err("reset_get_by_name(rst) failed: %d\n", ret);
@@ -1375,6 +1383,42 @@ static int eqos_remove_resources_tegra186(struct udevice *dev)
        return 0;
 }
 
+/*
+ * Get driver data based on the device tree. Boards not using a device tree can
+ * overwrite this function.
+ */
+__weak void *eqos_get_driver_data(struct udevice *dev)
+{
+       return (void *)dev_get_driver_data(dev);
+}
+
+static fdt_addr_t eqos_get_base_addr_common(struct udevice *dev, fdt_addr_t addr)
+{
+       struct eqos_priv *eqos = dev_get_priv(dev);
+
+       if (addr == FDT_ADDR_T_NONE) {
+#if CONFIG_IS_ENABLED(FDT_64BIT)
+               dev_err(dev, "addr=0x%llx is invalid.\n", addr);
+#else
+               dev_err(dev, "addr=0x%x is invalid.\n", addr);
+#endif
+               return -EINVAL;
+       }
+
+       eqos->regs = addr;
+       eqos->mac_regs = (void *)(addr + EQOS_MAC_REGS_BASE);
+       eqos->mtl_regs = (void *)(addr + EQOS_MTL_REGS_BASE);
+       eqos->dma_regs = (void *)(addr + EQOS_DMA_REGS_BASE);
+
+       return 0;
+}
+
+int eqos_get_base_addr_dt(struct udevice *dev)
+{
+       fdt_addr_t addr = dev_read_addr(dev);
+       return eqos_get_base_addr_common(dev, addr);
+}
+
 static int eqos_probe(struct udevice *dev)
 {
        struct eqos_priv *eqos = dev_get_priv(dev);
@@ -1383,17 +1427,12 @@ static int eqos_probe(struct udevice *dev)
        debug("%s(dev=%p):\n", __func__, dev);
 
        eqos->dev = dev;
-       eqos->config = (void *)dev_get_driver_data(dev);
 
-       eqos->regs = dev_read_addr(dev);
-       if (eqos->regs == FDT_ADDR_T_NONE) {
-               pr_err("dev_read_addr() failed\n");
+       eqos->config = eqos_get_driver_data(dev);
+       if (!eqos->config) {
+               pr_err("Failed to get driver data.\n");
                return -ENODEV;
        }
-       eqos->mac_regs = (void *)(eqos->regs + EQOS_MAC_REGS_BASE);
-       eqos->mtl_regs = (void *)(eqos->regs + EQOS_MTL_REGS_BASE);
-       eqos->dma_regs = (void *)(eqos->regs + EQOS_DMA_REGS_BASE);
-       eqos->tegra186_regs = (void *)(eqos->regs + EQOS_TEGRA186_REGS_BASE);
 
        eqos->max_speed = dev_read_u32_default(dev, "max-speed", 0);
 
index c7d3e23ab7bf1bfb45389594ae03f7ede74881b0..b37d3d2f5dd1808a45e01e7ed1aa6860f3fd5017 100644 (file)
@@ -289,7 +289,9 @@ void eqos_inval_desc_generic(void *desc);
 void eqos_flush_desc_generic(void *desc);
 void eqos_inval_buffer_generic(void *buf, size_t size);
 void eqos_flush_buffer_generic(void *buf, size_t size);
+int eqos_get_base_addr_dt(struct udevice *dev);
 int eqos_null_ops(struct udevice *dev);
+void *eqos_get_driver_data(struct udevice *dev);
 
 extern struct eqos_config eqos_imx_config;
 extern struct eqos_config eqos_rockchip_config;
index d6bed278ca799443f6cf11251a247faf3d184758..642432834f503a17bc95ef76d9b4a4fcd075b920 100644 (file)
@@ -47,6 +47,12 @@ static int eqos_probe_resources_imx(struct udevice *dev)
 
        debug("%s(dev=%p):\n", __func__, dev);
 
+       ret = eqos_get_base_addr_dt(dev);
+       if (ret) {
+               dev_dbg(dev, "eqos_get_base_addr_dt failed: %d", ret);
+               goto err_probe;
+       }
+
        interface = eqos->config->interface(dev);
 
        if (interface == PHY_INTERFACE_MODE_NA) {
index 77d626393d5afc3139ecded374cd1e9ece2a7680..de0ae090c5ddc6631a45eef97a18762d508da759 100644 (file)
@@ -522,6 +522,12 @@ static int eqos_probe_resources_qcom(struct udevice *dev)
 
        debug("%s(dev=%p):\n", __func__, dev);
 
+       ret = eqos_get_base_addr_dt(dev);
+       if (ret) {
+               pr_err("eqos_get_base_addr_dt failed: %d\n", ret);
+               return ret;
+       }
+
        interface = eqos->config->interface(dev);
 
        if (interface == PHY_INTERFACE_MODE_NA) {
index c4557e57988dc56755e549e9a91d865a19f08811..9fc8c686b889d990e671fd377bea8643163d71ee 100644 (file)
@@ -311,6 +311,12 @@ static int eqos_probe_resources_rk(struct udevice *dev)
        int reset_flags = GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE;
        int ret;
 
+       ret = eqos_get_base_addr_dt(dev);
+       if (ret) {
+               dev_err(dev, "eqos_get_base_addr_dt failed: %d\n", ret);
+               return ret;
+       }
+
        data = calloc(1, sizeof(struct rockchip_platform_data));
        if (!data)
                return -ENOMEM;
index 09e714ce76a0e6f747ad9b1d0c8dcc65cdcd80af..d9ace435ee2b65871c97dec52755f569622aa689 100644 (file)
@@ -183,6 +183,12 @@ static int eqos_probe_resources_jh7110(struct udevice *dev)
        struct starfive_platform_data *data;
        int ret;
 
+       ret = eqos_get_base_addr_dt(dev);
+       if (ret) {
+               pr_err("eqos_get_base_addr_dt failed: %d\n", ret);
+               return ret;
+       }
+
        data = calloc(1, sizeof(struct starfive_platform_data));
        if (!data)
                return -ENOMEM;
index cffaa10b7055b47d613062eb16f9fdabb89495c1..f3a973f37742a7f3ec09cbd74a223c645cb68c43 100644 (file)
@@ -234,6 +234,12 @@ static int eqos_probe_resources_stm32(struct udevice *dev)
 
        interface = eqos->config->interface(dev);
 
+       ret = eqos_get_base_addr_dt(dev);
+       if (ret) {
+               dev_err(dev, "eqos_get_base_addr_dt failed: %d\n", ret);
+               return ret;
+       }
+
        if (interface == PHY_INTERFACE_MODE_NA) {
                dev_err(dev, "Invalid PHY interface\n");
                return -EINVAL;