为什么 ififd 的 pci linux 实现使用 "platform_driver" 而不是 "pci_driver"?

Why is the pci linux implementation for ififd using "platform_driver" instead of "pci_driver"?

linux 主线内核(link) 使用 platform_driver 结构而不是 pci_driver 的 PCI-IFIFD CAN 实现(drivers/net/can)结构。
我很难区分这两种结构。因此我告诉自己:
- platform driver vs normal device driver
- platform_driver
- pci_driver

根据第一个来源:

Unlike PCI or USB devices, I2C devices are not enumerated at the hardware level (at run time). Instead, the software must know (at compile time) which devices are connected on each I2C bus segment. So USB and PCI are not platform devices.

如果是这样,为什么 PCI ififd 实现使用 platform_driver 结构?
此外,如何使用 ififd 将此驱动程序用于 pci 卡?

你必须区分 platform_driver 是总线(控制器)驱动程序和 pci_driver 是 PCI 设备驱动程序(总线上的客户端)。

这是 CAN 总线驱动程序 CAN bus driver for IFI CANFD controller

总线控制器(适配器)作为 platform_devices

注册到内核

PCI 驱动程序提供挂钩(回调)和结构来将 PCI 设备注册到内核 PCI 层并将其绑定到设备。

pci_register_driver() 用于为 struct pci_device_id xxx_pci_tbl[] table 中定义的 PCI 总线上的现​​有 PCI 设备注册 pci_driver 结构,供应商和与设备匹配的设备 ID。

struct pci_driver xxx_driver = {
    .name           = DRV_NAME,
    .probe          = xxx_pci_probe,
    .remove         = xxx_pci_remove,
    .id_table       = xxx_pci_tbl

/Documentation/PCI/pci.txt