Функция зонда для драйвера spi в сочетании с драйвером платформы считывателя карт mag swipe не вызывается

У меня есть HAT, включающий устройство считывания магнитных карт, подключенное к stm32mp135f-dk. mag-swipe использует spi5, поэтому драйвер включает драйвер платформы mag-swipe и драйвер spi mag-swipe-spi, отсюда и использование «module_init».
Функция проверки драйвера платформы «mag_swipe_probe» вызывается, но функция проверки драйвера spi «mag_swipe_spidev_driver_probe» не вызывается, хотя обе успешно зарегистрированы вместе с прерыванием gpio — для иллюстрации проблемы была добавлена ​​отладка. Может ли кто-нибудь посоветовать, что мешает вызову функции spi probe, пожалуйста?

Лог-файл показывает следующее:

      [  108.299524] mag_swipe: loading out-of-tree module taints kernel.
[  108.361979] Mag-swipe Driver: Mag swipe spidev init called - now registering drivers
[  108.368359] Mag-swipe Driver: attempt to register spi driver
[  108.493673] ************* __spi_register_driver *************
[  108.559431] Mag-swipe Driver: return status indicated mag swipe SPIDEV driver registered successfully!
[  108.631692] Mag-swipe Driver: attempt to register platform driver
[  108.636663] *************************Mag-swipe Driver entry point **********************
[  109.309893] Mag-swipe Driver: Get the data ready interrupt
[  109.382246] irq value: 67
[  109.383564] register mag-swipe interrupt passed (PG)
[  109.485906] Mag-swipe Driver: return status indicated mag swipe PLATFORM driver registered successfully!

Зарегистрированные драйверы показывают, как драйвер spi связан с драйвером платформы:

      root@stm32mp135f-dk:~# ls -l /sys/bus/spi/drivers
drwxr-xr-x    2 root     root             0 Sep 20 10:44 cpcap-core
drwxr-xr-x    2 root     root             0 Sep 20 10:44 hts221_spi
drwxr-xr-x    2 root     root             0 Sep 20 10:44 ks8851
drwxr-xr-x    2 root     root             0 Sep 20 10:44 mag-swipe-spi
drwxr-xr-x    2 root     root             0 Sep 20 10:44 mcp23s08
drwxr-xr-x    2 root     root             0 Sep 20 10:44 spi-nand
drwxr-xr-x    2 root     root             0 Sep 20 10:44 spi-nor
drwxr-xr-x    2 root     root             0 Sep 20 10:44 spidev
root@stm32mp135f-dk:~# ls -l /sys/bus/spi/drivers/mag-swipe-spi/
--w-------    1 root     root          4096 Sep 20 11:57 bind
lrwxrwxrwx    1 root     root             0 Sep 20 11:57 module -> ../../../../module/mag_swipe
--w-------    1 root     root          4096 Sep 20 10:44 uevent
--w-------    1 root     root          4096 Sep 20 11:57 unbind
root@stm32mp135f-dk:~# ls -l /sys/module/mag_swipe/
-r--r--r--    1 root     root          4096 Sep 20 11:57 coresize
drwxr-xr-x    2 root     root             0 Sep 20 11:57 drivers
drwxr-xr-x    2 root     root             0 Sep 20 11:57 holders
-r--r--r--    1 root     root          4096 Sep 20 11:57 initsize
-r--r--r--    1 root     root          4096 Sep 20 10:44 initstate
drwxr-xr-x    2 root     root             0 Sep 20 11:57 notes
drwxr-xr-x    2 root     root             0 Sep 20 11:57 parameters
-r--r--r--    1 root     root          4096 Sep 20 11:57 refcnt
drwxr-xr-x    2 root     root             0 Sep 20 11:57 sections
-r--r--r--    1 root     root          4096 Sep 20 11:57 srcversion
-r--r--r--    1 root     root          4096 Sep 20 11:57 taint
--w-------    1 root     root          4096 Sep 20 10:44 uevent
-r--r--r--    1 root     root          4096 Sep 20 11:57 version
root@stm32mp135f-dk:~# ls -l /sys/module/mag_swipe/drivers/
lrwxrwxrwx    1 root     root             0 Sep 20 11:57 platform:mag-swipe -> ../../../bus/platform/drivers/mag-swipe
lrwxrwxrwx    1 root     root             0 Sep 20 11:57 spi:mag-swipe-spi -> ../../../bus/spi/drivers/mag-swipe-spi

Моя конфигурация дерева устройств соответствует рекомендуемой конфигурации дерева устройств ST SPI: stm32mp135f-dk.dts.

      / {
        model = "STMicroelectronics STM32MP135F-DK Discovery Board";
        compatible = "st,stm32mp135f-dk", "st,stm32mp135";
…………
        mag_swipe: my_company_mag_swipe_handler {
                compatible = "my_company,mag-swipe";
                interrupt-parent = <&gpioe>;
                interrupts = <6 2>; /* Setting 2 - high to low trigger. */
                mag-swipe-gpio = <&gpioe 5 GPIO_ACTIVE_HIGH>;
        };

};

&spi5 {
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&spi5_pins_a>;
        pinctrl-1 = <&spi5_sleep_pins_a>;
        status = "okay";

        mag-swipe-spi@0 {
                compatible = "my_company,mag-swipe-spi";
                reg = <0>;
                spi-max-frequency = <10000000>;
        };

stm32mp131.dtsi

      #spi controller
                spi5: spi@4c003000 {
                        #address-cells = <1>;
                        #size-cells = <0>;
                        compatible = "st,stm32h7-spi";
                        reg = <0x4c003000 0x400>;
                        interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&rcc SPI5_K>;
                        resets = <&rcc SPI5_R>;
                        dmas = <&dmamux1 85 0x400 0x01>,
                               <&dmamux1 86 0x400 0x01>;
                        dma-names = "rx", "tx";
                        status = "disabled";
                };

Выдержка из кода драйвера выглядит следующим образом:

mag-swipe.c

      //platform driver section 
static int mag_swipe_probe(struct platform_device *pdev)
{
….
}

static const struct of_device_id my_company_mag_swipe_of_match[] = {
        {
                .compatible = "my_company,mag-swipe",
        },
        {},
};

MODULE_DEVICE_TABLE(of, my_company_mag_swipe_of_match);

static struct platform_driver mag_swipe_driver = {
    .probe = mag_swipe_probe,
    .remove = mag_swipe_remove,
    .suspend = mag_swipe_suspend,
    .resume = mag_swipe_resume,
    .driver = {
                .name = "mag-swipe",
                .of_match_table = of_match_ptr( my_company_mag_swipe_of_match ),
        },
};
      //spi driver section 
static int mag_swipe_spidev_driver_probe(struct spi_device *spi)
{
        int status;
        printk("Mag-swipe Driver: Mag swipe spidev driver probe\n");
        return status;
}

static int mag_swipe_spidev_data_probe(struct spi_device *dev)
{
        int status;
        printk("Mag-swipe Driver: Mag swipe spidev data probe\n");
        return status;
}


static const struct spi_device_id mag_swipe_spi_id[] = {
        { "mag-swipe-spi", (unsigned long)mag_swipe_spidev_data_probe },
        {}
};

MODULE_DEVICE_TABLE(spi, mag_swipe_spi_id);

static const struct of_device_id my_company_mag_swipe_spi_of_match[] = {
        { .compatible = "my_company,mag-swipe-spi", .data =  mag_swipe_spidev_data_probe },
        {},
};

MODULE_DEVICE_TABLE(of, my_company_mag_swipe_spi_of_match);

static struct spi_driver mag_swipe_spidev_spi_driver = {
        .driver = {
                .name =         "mag-swipe-spi",
                .of_match_table = of_match_ptr( my_company_mag_swipe_spi_of_match ),

        },
        .probe =        mag_swipe_spidev_driver_probe,
        .remove =       mag_swipe_spidev_remove,
        .id_table =     mag_swipe_spi_id,
};


static int __init mag_swipe_spidev_init(void)
{
        int status;
        printk("Mag-swipe Driver: Mag swipe spidev init called - now registering drivers\n");

        printk("Mag-swipe Driver: attempt to register spi driver\n");
        status = spi_register_driver(&mag_swipe_spidev_spi_driver);
        if (status < 0)
        {
                printk("Mag-swipe Driver: failed to register mag swipe spidev driver!\n");
                return status;
        }
        printk("Mag-swipe Driver: return status indicated mag swipe SPIDEV driver registered successfully!\n");

        printk("Mag-swipe Driver: attempt to register platform driver\n");
        status = platform_driver_register(&mag_swipe_driver);
        if (status < 0)
        {
                printk("Mag-swipe Driver: failed to register mag swipe platform driver!\n");
                return status;
        }
        printk("Mag-swipe Driver: return status indicated mag swipe PLATFORM driver registered successfully!\n");

        return status;
}

static void __exit mag_swipe_spidev_exit(void)
{
        printk("Mag-swipe Driver: Mag swipe spidev exit called - now unregistering driver\n");
        platform_driver_unregister(&mag_swipe_driver);
}

module_init( mag_swipe_spidev_init );
module_exit( mag_swipe_spidev_exit );

0 ответов

Другие вопросы по тегам