]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: stmmac: dwmac-loongson: Introduce PCI device info data
authorYanteng Si <siyanteng@loongson.cn>
Wed, 7 Aug 2024 13:48:04 +0000 (21:48 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 13 Aug 2024 07:48:00 +0000 (09:48 +0200)
The Loongson GNET device support is about to be added in one of the
next commits. As another preparation for that introduce the PCI device
info data with a setup() callback performing the device-specific
platform data initializations. Currently it is utilized for the
already supported Loongson GMAC device only.

Signed-off-by: Feiyang Chen <chenfeiyang@loongson.cn>
Signed-off-by: Yinggang Gu <guyinggang@loongson.cn>
Reviewed-by: Serge Semin <fancer.lancer@gmail.com>
Acked-by: Huacai Chen <chenhuacai@loongson.cn>
Signed-off-by: Yanteng Si <siyanteng@loongson.cn>
Tested-by: Serge Semin <fancer.lancer@gmail.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/stmicro/stmmac/dwmac-loongson.c

index 7d3f284b9176c337c89f00c7763a65bc465b22e9..10b49bea8e3cdd01399645ac34bee784fb7e5d64 100644 (file)
 
 #define PCI_DEVICE_ID_LOONGSON_GMAC    0x7a03
 
+struct stmmac_pci_info {
+       int (*setup)(struct plat_stmmacenet_data *plat);
+};
+
 static void loongson_default_data(struct plat_stmmacenet_data *plat)
 {
        plat->clk_csr = 2;      /* clk_csr_i = 20-35MHz & MDC = clk_csr_i/16 */
@@ -57,9 +61,14 @@ static int loongson_gmac_data(struct plat_stmmacenet_data *plat)
        return 0;
 }
 
+static struct stmmac_pci_info loongson_gmac_pci_info = {
+       .setup = loongson_gmac_data,
+};
+
 static int loongson_dwmac_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        struct plat_stmmacenet_data *plat;
+       struct stmmac_pci_info *info;
        struct stmmac_resources res;
        struct device_node *np;
        int ret, i, phy_mode;
@@ -125,10 +134,14 @@ static int loongson_dwmac_probe(struct pci_dev *pdev, const struct pci_device_id
 
        pci_set_master(pdev);
 
-       loongson_gmac_data(plat);
        memset(&res, 0, sizeof(res));
        res.addr = pcim_iomap_table(pdev)[0];
 
+       info = (struct stmmac_pci_info *)id->driver_data;
+       ret = info->setup(plat);
+       if (ret)
+               goto err_disable_device;
+
        res.irq = of_irq_get_byname(np, "macirq");
        if (res.irq < 0) {
                dev_err(&pdev->dev, "IRQ macirq not found\n");
@@ -220,7 +233,7 @@ static SIMPLE_DEV_PM_OPS(loongson_dwmac_pm_ops, loongson_dwmac_suspend,
                         loongson_dwmac_resume);
 
 static const struct pci_device_id loongson_dwmac_id_table[] = {
-       { PCI_DEVICE_DATA(LOONGSON, GMAC, NULL) },
+       { PCI_DEVICE_DATA(LOONGSON, GMAC, &loongson_gmac_pci_info) },
        {}
 };
 MODULE_DEVICE_TABLE(pci, loongson_dwmac_id_table);