hc
2024-03-25 edb30157bad0c0001c32b854271ace01d3b9a16a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/**
 ******************************************************************************
 *
 * @file rwnx_pci.c
 *
 * Copyright (C) RivieraWaves 2012-2019
 *
 ******************************************************************************
 */
#include <linux/pci.h>
#include <linux/module.h>
 
#include "rwnx_defs.h"
#include "rwnx_dini.h"
#include "rwnx_v7.h"
 
#define PCI_VENDOR_ID_DINIGROUP              0x17DF
#define PCI_DEVICE_ID_DINIGROUP_DNV6_F2PCIE  0x1907
 
#define PCI_DEVICE_ID_XILINX_CEVA_VIRTEX7    0x7011
 
static const struct pci_device_id rwnx_pci_ids[] = {
   {PCI_DEVICE(PCI_VENDOR_ID_DINIGROUP, PCI_DEVICE_ID_DINIGROUP_DNV6_F2PCIE)},
   {PCI_DEVICE(PCI_VENDOR_ID_XILINX, PCI_DEVICE_ID_XILINX_CEVA_VIRTEX7)},
   {0,}
};
 
 
/* Uncomment this for depmod to create module alias */
/* We don't want this on development platform */
//MODULE_DEVICE_TABLE(pci, rwnx_pci_ids);
 
static int rwnx_pci_probe(struct pci_dev *pci_dev,
                         const struct pci_device_id *pci_id)
{
   struct rwnx_plat *rwnx_plat = NULL;
   void *drvdata;
   int ret = -ENODEV;
 
   RWNX_DBG(RWNX_FN_ENTRY_STR);
 
   if (pci_id->vendor == PCI_VENDOR_ID_DINIGROUP) {
       ret = rwnx_dini_platform_init(pci_dev, &rwnx_plat);
   } else if (pci_id->vendor == PCI_VENDOR_ID_XILINX) {
       ret = rwnx_v7_platform_init(pci_dev, &rwnx_plat);
   }
 
   if (ret)
       return ret;
 
   rwnx_plat->pci_dev = pci_dev;
 
   ret = rwnx_platform_init(rwnx_plat, &drvdata);
   pci_set_drvdata(pci_dev, drvdata);
 
   if (ret)
       rwnx_plat->deinit(rwnx_plat);
 
   return ret;
}
 
static void rwnx_pci_remove(struct pci_dev *pci_dev)
{
   struct rwnx_hw *rwnx_hw;
   struct rwnx_plat *rwnx_plat;
 
   RWNX_DBG(RWNX_FN_ENTRY_STR);
 
   rwnx_hw = pci_get_drvdata(pci_dev);
   rwnx_plat = rwnx_hw->plat;
 
   rwnx_platform_deinit(rwnx_hw);
   rwnx_plat->deinit(rwnx_plat);
 
   pci_set_drvdata(pci_dev, NULL);
}
 
static struct pci_driver rwnx_pci_drv = {
   .name     = KBUILD_MODNAME,
   .id_table = rwnx_pci_ids,
   .probe    = rwnx_pci_probe,
   .remove   = rwnx_pci_remove
};
 
int rwnx_pci_register_drv(void)
{
   return pci_register_driver(&rwnx_pci_drv);
}
 
void rwnx_pci_unregister_drv(void)
{
   pci_unregister_driver(&rwnx_pci_drv);
}