Функция зонда для драйвера 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 );