1、linux同一bus下注册同名device问题

252 阅读2分钟

在linux驱动开发过程中,经常会使用到platform总线来开发,通过platform_driver_register()注册驱动,platform_device_register()来注册设备。如果在同一个platform bus下注册同name的device,那么会出现什么情况呢?

1、创建两个同名的platform_device

#define SWLED_DEV       "sw_led"
static struct platform_device swled_plfdev1 = {
    .name   = SWLED_DEV,
};
static struct platform_device swled_plfdev2 = {
    .name   = SWLED_DEV,
};

2、注册platform_device与platform_driver

ret = platform_device_register(&swled_plfdev1);
ret = platform_device_register(&swled_plfdev2);
ret = platform_driver_register(&swled_plfdrv);

3、编译软件后烧录到板卡查看结果

系统启动后直接崩溃后重启,崩溃信息如下:

sysfs: cannot create duplicate filename '/devices/platform/sw_led.0'
[    1.770270@2]  CPU: 2 PID: 1 Comm: init Tainted: G        WC O      5.4.125-android11-2-g88fd5a73906d-dirty-ab1656 #1
[    1.771587@2]  Hardware name: Amlogic (DT)
[    1.772097@2]  Call trace:
[    1.772442@2]  [ffffffc0200037f0+  64][<ffffffc0100c63b4>] dump_backtrace+0x0/0x18c
[    1.773387@2]  [ffffffc020003830+  32][<ffffffc0100c6564>] show_stack+0x24/0x34
[    1.774300@2]  [ffffffc020003850+  80][<ffffffc010dcc6b8>] dump_stack+0xbc/0x108
[    1.775220@2]  [ffffffc0200038a0+  64][<ffffffc0103bb810>] sysfs_create_dir_ns+0x104/0x160
[    1.776248@2]  [ffffffc0200038e0+ 176][<ffffffc010dd35bc>] kobject_add_internal+0x1e0/0x420
[    1.777287@2]  [ffffffc020003990+  64][<ffffffc010dd2804>] kobject_add+0x88/0xdc
[    1.778211@2]  [ffffffc0200039d0+  64][<ffffffc01076dfd8>] device_add+0x150/0xa48
[    1.779142@2]  [ffffffc020003a10+  80][<ffffffc010777440>] platform_device_add+0x88/0x228
[    1.780158@2]  [ffffffc020003a60+  32][<ffffffc01077702c>] platform_device_register+0x38/0x6c
[    1.781228@2]  [ffffffc020003a80+ 400][<ffffffc0099a0660>] swled_dev_init+0x58/0x9c [swoled]
[    1.782273@2]  [ffffffc020003c10+  64][<ffffffc01008c748>] do_one_initcall+0x130/0x294
[    1.783259@2]  [ffffffc020003c50+ 240][<ffffffc0101aed78>] do_init_module+0x5c/0x21c
[    1.784221@2]  [ffffffc020003d40+ 240][<ffffffc0101aec18>] load_module+0x3a3c/0x3aac
[    1.785184@2]  [ffffffc020003e30+  48][<ffffffc0101a9964>] __arm64_sys_finit_module+0xbc/0xd8
[    1.786248@2]  [ffffffc020003e60+  64][<ffffffc0100d1408>] el0_svc_common+0xb0/0x188
[    1.787210@2]  [ffffffc020003ea0+ 336][<ffffffc0100d150c>] el0_svc_compat_handler+0x2c/0x3c
[    1.788250@2]  [ffffffc020003ff0+   0][<ffffffc010083524>] el0_svc_compat+0x8/0x24
[    1.789504@2]  kobject_add_internal failed for sw_led.0 with -EEXIST, don't try to register things with the same name in the same directory.

......

[    1.854730@3]  swapper pgtable: 4k pages, 39-bit VAs, pgdp=0000000002193000
[    1.855565@3]  [ffffffc0099a4260] pgd=00000000adbff003, pud=00000000adbff003, pmd=00000000a4597003, pte=0000000000000000
[    1.856920@3]  Internal error: Oops: 96000007 [#1] PREEMPT SMP

......

[    1.878500@3]  CPU: 3 PID: 27 Comm: kworker/3:0 Tainted: G        WC O      5.4.125-android11-2-g88fd5a73906d-dirty-ab1656 #1
[    1.879905@3]  Hardware name: Amlogic (DT)
[    1.880428@3]  Workqueue: events deferred_probe_work_func
[    1.881088@3]  pstate: 60c00109 (nZCv dAif +PAN +UAO)
[    1.881720@3]  pc : __list_del_entry_valid+0x40/0xa4
[    1.882335@3]  lr : device_reorder_to_tail+0x50/0x11c

从崩溃信息可得到原因:sysfs下同一个目录不能创建同名的文件夹。