On Fri, Dec 17, 2021 at 10:18:59AM -0700, Mathieu Poirier wrote:
[...]
@@ -618,7 +632,43 @@ static struct amba_driver tmc_driver = { .id_table = tmc_ids, }; -module_amba_driver(tmc_driver);
[...]
+static int __init tmc_init(void) +{
- int ret;
- ret = alloc_chrdev_region(&tmc_major, 0, TMC_DEV_MAX, "tmc");
- if (ret < 0) {
pr_err("tmc: failed to allocate char dev region\n");
return ret;
- }
- tmc_class = class_create(THIS_MODULE, "tmc");
- if (IS_ERR(tmc_class)) {
pr_err("failed to create tmc class\n");
ret = PTR_ERR(tmc_class);
unregister_chrdev_region(tmc_major, TMC_DEV_MAX);
return ret;
- }
- ret = amba_driver_register(&tmc_driver);
- if (ret) {
pr_err("tmc: error registering amba driver\n");
class_destroy(tmc_class);
unregister_chrdev_region(tmc_major, TMC_DEV_MAX);
- }
- return ret;
+}
[...]
+module_init(tmc_init);
Should invoke tmc_init() in an ealier phase so it can prepare device class prior to the TMC devices registration? In other words, I think here should be:
subsys_initcall(tmc_init);
TMC devices won't be registered until a TMC driver is registered, which happens after the creation of the class. Anything I am missing?
No, I introduced noise and sorry for that.
The race condition between creating TMC class (subsystem) and TMC driver probing has been handled well by this patch.
It removes "module_amba_driver(tmc_driver)", then in tmc_init(), uses amba_driver_register() to register TMC driver. So that can ensure the TMC class has been created prior to TMC driver registeration and TMC driver probing.
Please ignore my comment for using subsys_initcall().
Thanks, Leo