165e0ace2SJie Deng /* Synopsys DesignWare Core Enterprise Ethernet (XLGMAC) Driver 265e0ace2SJie Deng * 365e0ace2SJie Deng * Copyright (c) 2017 Synopsys, Inc. (www.synopsys.com) 465e0ace2SJie Deng * 5*ea8c1c64SJie Deng * This program is dual-licensed; you may select either version 2 of 6*ea8c1c64SJie Deng * the GNU General Public License ("GPL") or BSD license ("BSD"). 765e0ace2SJie Deng * 865e0ace2SJie Deng * This Synopsys DWC XLGMAC software driver and associated documentation 965e0ace2SJie Deng * (hereinafter the "Software") is an unsupported proprietary work of 1065e0ace2SJie Deng * Synopsys, Inc. unless otherwise expressly agreed to in writing between 1165e0ace2SJie Deng * Synopsys and you. The Software IS NOT an item of Licensed Software or a 1265e0ace2SJie Deng * Licensed Product under any End User Software License Agreement or 1365e0ace2SJie Deng * Agreement for Licensed Products with Synopsys or any supplement thereto. 1465e0ace2SJie Deng * Synopsys is a registered trademark of Synopsys, Inc. Other names included 1565e0ace2SJie Deng * in the SOFTWARE may be the trademarks of their respective owners. 1665e0ace2SJie Deng */ 1765e0ace2SJie Deng 1865e0ace2SJie Deng #include <linux/kernel.h> 1965e0ace2SJie Deng #include <linux/module.h> 2065e0ace2SJie Deng #include <linux/pci.h> 2165e0ace2SJie Deng 2265e0ace2SJie Deng #include "dwc-xlgmac.h" 2365e0ace2SJie Deng #include "dwc-xlgmac-reg.h" 2465e0ace2SJie Deng 2565e0ace2SJie Deng static int xlgmac_probe(struct pci_dev *pcidev, const struct pci_device_id *id) 2665e0ace2SJie Deng { 2765e0ace2SJie Deng struct device *dev = &pcidev->dev; 2865e0ace2SJie Deng struct xlgmac_resources res; 2965e0ace2SJie Deng int i, ret; 3065e0ace2SJie Deng 3165e0ace2SJie Deng ret = pcim_enable_device(pcidev); 3265e0ace2SJie Deng if (ret) { 3365e0ace2SJie Deng dev_err(dev, "ERROR: failed to enable device\n"); 3465e0ace2SJie Deng return ret; 3565e0ace2SJie Deng } 3665e0ace2SJie Deng 3765e0ace2SJie Deng for (i = 0; i <= PCI_STD_RESOURCE_END; i++) { 3865e0ace2SJie Deng if (pci_resource_len(pcidev, i) == 0) 3965e0ace2SJie Deng continue; 4065e0ace2SJie Deng ret = pcim_iomap_regions(pcidev, BIT(i), XLGMAC_DRV_NAME); 4165e0ace2SJie Deng if (ret) 4265e0ace2SJie Deng return ret; 4365e0ace2SJie Deng break; 4465e0ace2SJie Deng } 4565e0ace2SJie Deng 4665e0ace2SJie Deng pci_set_master(pcidev); 4765e0ace2SJie Deng 4865e0ace2SJie Deng memset(&res, 0, sizeof(res)); 4965e0ace2SJie Deng res.irq = pcidev->irq; 5065e0ace2SJie Deng res.addr = pcim_iomap_table(pcidev)[i]; 5165e0ace2SJie Deng 5265e0ace2SJie Deng return xlgmac_drv_probe(&pcidev->dev, &res); 5365e0ace2SJie Deng } 5465e0ace2SJie Deng 5565e0ace2SJie Deng static void xlgmac_remove(struct pci_dev *pcidev) 5665e0ace2SJie Deng { 5765e0ace2SJie Deng xlgmac_drv_remove(&pcidev->dev); 5865e0ace2SJie Deng } 5965e0ace2SJie Deng 6065e0ace2SJie Deng static const struct pci_device_id xlgmac_pci_tbl[] = { 6165e0ace2SJie Deng { PCI_DEVICE(PCI_VENDOR_ID_SYNOPSYS, 0x7302) }, 6265e0ace2SJie Deng { 0 } 6365e0ace2SJie Deng }; 6465e0ace2SJie Deng MODULE_DEVICE_TABLE(pci, xlgmac_pci_tbl); 6565e0ace2SJie Deng 6665e0ace2SJie Deng static struct pci_driver xlgmac_pci_driver = { 6765e0ace2SJie Deng .name = XLGMAC_DRV_NAME, 6865e0ace2SJie Deng .id_table = xlgmac_pci_tbl, 6965e0ace2SJie Deng .probe = xlgmac_probe, 7065e0ace2SJie Deng .remove = xlgmac_remove, 7165e0ace2SJie Deng }; 7265e0ace2SJie Deng 7365e0ace2SJie Deng module_pci_driver(xlgmac_pci_driver); 7465e0ace2SJie Deng 7565e0ace2SJie Deng MODULE_DESCRIPTION(XLGMAC_DRV_DESC); 7665e0ace2SJie Deng MODULE_VERSION(XLGMAC_DRV_VERSION); 7765e0ace2SJie Deng MODULE_AUTHOR("Jie Deng <jiedeng@synopsys.com>"); 7865e0ace2SJie Deng MODULE_LICENSE("Dual BSD/GPL"); 79