can: peak_pci: Add name and FW version of the card in kernel buffer
authorStephane Grosjean <s.grosjean@peak-system.com>
Mon, 7 Jun 2021 15:17:20 +0000 (17:17 +0200)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Sun, 25 Jul 2021 09:36:27 +0000 (11:36 +0200)
This patch adds name and (possibly) firmware version information to
the kernel about the detected PEAK-System CAN - PCI/PCIe interface
card.

Link: https://lore.kernel.org/r/20210607151720.13571-1-s.grosjean@peak-system.com
Signed-off-by: Stephane Grosjean <s.grosjean@peak-system.com>
[mkl: reformated struct pci_device_id peak_pci_tbl]
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/sja1000/peak_pci.c

index aff8a1d..6db90dc 100644 (file)
@@ -28,6 +28,10 @@ MODULE_LICENSE("GPL v2");
 
 #define DRV_NAME  "peak_pci"
 
+/* FPGA cards FW version registers */
+#define PEAK_VER_REG1          0x40
+#define PEAK_VER_REG2          0x44
+
 struct peak_pciec_card;
 struct peak_pci_chan {
        void __iomem *cfg_base;         /* Common for all channels */
@@ -68,19 +72,41 @@ static const u16 peak_pci_icr_masks[PEAK_PCI_CHAN_MAX] = {
 };
 
 static const struct pci_device_id peak_pci_tbl[] = {
-       {PEAK_PCI_VENDOR_ID, PEAK_PCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
-       {PEAK_PCI_VENDOR_ID, PEAK_PCIE_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
-       {PEAK_PCI_VENDOR_ID, PEAK_MPCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
-       {PEAK_PCI_VENDOR_ID, PEAK_MPCIE_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
-       {PEAK_PCI_VENDOR_ID, PEAK_PC_104P_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
-       {PEAK_PCI_VENDOR_ID, PEAK_PCI_104E_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
-       {PEAK_PCI_VENDOR_ID, PEAK_CPCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
-       {PEAK_PCI_VENDOR_ID, PEAK_PCIE_OEM_ID, PCI_ANY_ID, PCI_ANY_ID,},
+       {
+               PEAK_PCI_VENDOR_ID, PEAK_PCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,
+               .driver_data = (kernel_ulong_t)"PCAN-PCI",
+       }, {
+               PEAK_PCI_VENDOR_ID, PEAK_PCIE_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,
+               .driver_data = (kernel_ulong_t)"PCAN-PCI Express",
+       }, {
+               PEAK_PCI_VENDOR_ID, PEAK_MPCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,
+               .driver_data = (kernel_ulong_t)"PCAN-miniPCI",
+       }, {
+               PEAK_PCI_VENDOR_ID, PEAK_MPCIE_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,
+               .driver_data = (kernel_ulong_t)"PCAN-miniPCIe",
+       }, {
+               PEAK_PCI_VENDOR_ID, PEAK_PC_104P_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,
+               .driver_data = (kernel_ulong_t)"PCAN-PC/104-Plus Quad",
+       }, {
+               PEAK_PCI_VENDOR_ID, PEAK_PCI_104E_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,
+               .driver_data = (kernel_ulong_t)"PCAN-PCI/104-Express",
+       }, {
+               PEAK_PCI_VENDOR_ID, PEAK_CPCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,
+               .driver_data = (kernel_ulong_t)"PCAN-cPCI",
+       }, {
+               PEAK_PCI_VENDOR_ID, PEAK_PCIE_OEM_ID, PCI_ANY_ID, PCI_ANY_ID,
+               .driver_data = (kernel_ulong_t)"PCAN-Chip PCIe",
+       },
 #ifdef CONFIG_CAN_PEAK_PCIEC
-       {PEAK_PCI_VENDOR_ID, PEAK_PCIEC_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
-       {PEAK_PCI_VENDOR_ID, PEAK_PCIEC34_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
+       {
+               PEAK_PCI_VENDOR_ID, PEAK_PCIEC_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,
+               .driver_data = (kernel_ulong_t)"PCAN-ExpressCard",
+       }, {
+               PEAK_PCI_VENDOR_ID, PEAK_PCIEC34_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,
+               .driver_data = (kernel_ulong_t)"PCAN-ExpressCard 34",
+       },
 #endif
-       {0,}
+       { /* sentinel */ }
 };
 
 MODULE_DEVICE_TABLE(pci, peak_pci_tbl);
@@ -530,6 +556,7 @@ static int peak_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        void __iomem *cfg_base, *reg_base;
        u16 sub_sys_id, icr;
        int i, err, channels;
+       char fw_str[14] = "";
 
        err = pci_enable_device(pdev);
        if (err)
@@ -583,6 +610,21 @@ static int peak_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        /* Leave parport mux mode */
        writeb(0x04, cfg_base + PITA_MISC + 3);
 
+       /* FPGA equipped card if not 0 */
+       if (readl(cfg_base + PEAK_VER_REG1)) {
+               /* FPGA card: display version of the running firmware */
+               u32 fw_ver = readl(cfg_base + PEAK_VER_REG2);
+
+               snprintf(fw_str, sizeof(fw_str), " FW v%u.%u.%u",
+                        (fw_ver >> 12) & 0xf,
+                        (fw_ver >> 8) & 0xf,
+                        (fw_ver >> 4) & 0xf);
+       }
+
+       /* Display commercial name (and, eventually, FW version) of the card */
+       dev_info(&pdev->dev, "%ux CAN %s%s\n",
+                channels, (const char *)ent->driver_data, fw_str);
+
        icr = readw(cfg_base + PITA_ICR + 2);
 
        for (i = 0; i < channels; i++) {