2017-03-07 23:06:18 -07:00
|
|
|
/* Synopsys DesignWare Core Enterprise Ethernet (XLGMAC) Driver
|
|
|
|
*
|
|
|
|
* Copyright (c) 2017 Synopsys, Inc. (www.synopsys.com)
|
|
|
|
*
|
2017-03-22 21:03:45 -07:00
|
|
|
* This program is dual-licensed; you may select either version 2 of
|
|
|
|
* the GNU General Public License ("GPL") or BSD license ("BSD").
|
2017-03-07 23:06:18 -07:00
|
|
|
*
|
|
|
|
* This Synopsys DWC XLGMAC software driver and associated documentation
|
|
|
|
* (hereinafter the "Software") is an unsupported proprietary work of
|
|
|
|
* Synopsys, Inc. unless otherwise expressly agreed to in writing between
|
|
|
|
* Synopsys and you. The Software IS NOT an item of Licensed Software or a
|
|
|
|
* Licensed Product under any End User Software License Agreement or
|
|
|
|
* Agreement for Licensed Products with Synopsys or any supplement thereto.
|
|
|
|
* Synopsys is a registered trademark of Synopsys, Inc. Other names included
|
|
|
|
* in the SOFTWARE may be the trademarks of their respective owners.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <linux/kernel.h>
|
|
|
|
#include <linux/module.h>
|
|
|
|
#include <linux/pci.h>
|
|
|
|
|
|
|
|
#include "dwc-xlgmac.h"
|
|
|
|
#include "dwc-xlgmac-reg.h"
|
|
|
|
|
|
|
|
static int xlgmac_probe(struct pci_dev *pcidev, const struct pci_device_id *id)
|
|
|
|
{
|
|
|
|
struct device *dev = &pcidev->dev;
|
|
|
|
struct xlgmac_resources res;
|
|
|
|
int i, ret;
|
|
|
|
|
|
|
|
ret = pcim_enable_device(pcidev);
|
|
|
|
if (ret) {
|
|
|
|
dev_err(dev, "ERROR: failed to enable device\n");
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2019-09-27 16:43:08 -07:00
|
|
|
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
2017-03-07 23:06:18 -07:00
|
|
|
if (pci_resource_len(pcidev, i) == 0)
|
|
|
|
continue;
|
|
|
|
ret = pcim_iomap_regions(pcidev, BIT(i), XLGMAC_DRV_NAME);
|
|
|
|
if (ret)
|
|
|
|
return ret;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
pci_set_master(pcidev);
|
|
|
|
|
|
|
|
memset(&res, 0, sizeof(res));
|
|
|
|
res.irq = pcidev->irq;
|
|
|
|
res.addr = pcim_iomap_table(pcidev)[i];
|
|
|
|
|
|
|
|
return xlgmac_drv_probe(&pcidev->dev, &res);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void xlgmac_remove(struct pci_dev *pcidev)
|
|
|
|
{
|
|
|
|
xlgmac_drv_remove(&pcidev->dev);
|
|
|
|
}
|
|
|
|
|
|
|
|
static const struct pci_device_id xlgmac_pci_tbl[] = {
|
|
|
|
{ PCI_DEVICE(PCI_VENDOR_ID_SYNOPSYS, 0x7302) },
|
|
|
|
{ 0 }
|
|
|
|
};
|
|
|
|
MODULE_DEVICE_TABLE(pci, xlgmac_pci_tbl);
|
|
|
|
|
|
|
|
static struct pci_driver xlgmac_pci_driver = {
|
|
|
|
.name = XLGMAC_DRV_NAME,
|
|
|
|
.id_table = xlgmac_pci_tbl,
|
|
|
|
.probe = xlgmac_probe,
|
|
|
|
.remove = xlgmac_remove,
|
|
|
|
};
|
|
|
|
|
|
|
|
module_pci_driver(xlgmac_pci_driver);
|