1 // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
2 /* Copyright 2019 NXP */
3 #include <linux/fsl/enetc_mdio.h>
4 #include <linux/of_mdio.h>
7 #define ENETC_MDIO_DEV_ID 0xee01
8 #define ENETC_MDIO_DEV_NAME "FSL PCIe IE Central MDIO"
9 #define ENETC_MDIO_BUS_NAME ENETC_MDIO_DEV_NAME " Bus"
10 #define ENETC_MDIO_DRV_NAME ENETC_MDIO_DEV_NAME " driver"
12 static int enetc_pci_mdio_probe(struct pci_dev
*pdev
,
13 const struct pci_device_id
*ent
)
15 struct enetc_mdio_priv
*mdio_priv
;
16 struct device
*dev
= &pdev
->dev
;
17 void __iomem
*port_regs
;
22 port_regs
= pci_iomap(pdev
, 0, 0);
24 dev_err(dev
, "iomap failed\n");
29 hw
= enetc_hw_alloc(dev
, port_regs
);
35 bus
= devm_mdiobus_alloc_size(dev
, sizeof(*mdio_priv
));
38 goto err_mdiobus_alloc
;
41 bus
->name
= ENETC_MDIO_BUS_NAME
;
42 bus
->read
= enetc_mdio_read
;
43 bus
->write
= enetc_mdio_write
;
45 mdio_priv
= bus
->priv
;
47 mdio_priv
->mdio_base
= ENETC_EMDIO_BASE
;
48 snprintf(bus
->id
, MII_BUS_ID_SIZE
, "%s", dev_name(dev
));
51 err
= pci_enable_device_mem(pdev
);
53 dev_err(dev
, "device enable failed\n");
57 err
= pci_request_region(pdev
, 0, KBUILD_MODNAME
);
59 dev_err(dev
, "pci_request_region failed\n");
63 err
= of_mdiobus_register(bus
, dev
->of_node
);
67 pci_set_drvdata(pdev
, bus
);
72 pci_release_mem_regions(pdev
);
74 pci_disable_device(pdev
);
83 static void enetc_pci_mdio_remove(struct pci_dev
*pdev
)
85 struct mii_bus
*bus
= pci_get_drvdata(pdev
);
86 struct enetc_mdio_priv
*mdio_priv
;
88 mdiobus_unregister(bus
);
89 mdio_priv
= bus
->priv
;
90 iounmap(mdio_priv
->hw
->port
);
91 pci_release_mem_regions(pdev
);
92 pci_disable_device(pdev
);
95 static const struct pci_device_id enetc_pci_mdio_id_table
[] = {
96 { PCI_DEVICE(PCI_VENDOR_ID_FREESCALE
, ENETC_MDIO_DEV_ID
) },
97 { 0, } /* End of table. */
99 MODULE_DEVICE_TABLE(pci
, enetc_pci_mdio_id_table
);
101 static struct pci_driver enetc_pci_mdio_driver
= {
102 .name
= KBUILD_MODNAME
,
103 .id_table
= enetc_pci_mdio_id_table
,
104 .probe
= enetc_pci_mdio_probe
,
105 .remove
= enetc_pci_mdio_remove
,
107 module_pci_driver(enetc_pci_mdio_driver
);
109 MODULE_DESCRIPTION(ENETC_MDIO_DRV_NAME
);
110 MODULE_LICENSE("Dual BSD/GPL");