Commit 805ff68c authored by Stephane Grosjean's avatar Stephane Grosjean Committed by Marc Kleine-Budde
Browse files

can: peak_pci: Add name and FW version of the card in kernel buffer

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: default avatarStephane Grosjean <s.grosjean@peak-system.com>
[mkl: reformated struct pci_device_id peak_pci_tbl]
Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent fe1fa138
Loading
Loading
Loading
Loading
+53 −11
Original line number Diff line number Diff line
@@ -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++) {