static struct platform_driver imx_wm8962_driver = { .driver = { .name = "imx-wm8962", .owner = THIS_MODULE, .pm = &snd_soc_pm_ops, .of_match_table = imx_wm8962_dt_ids, }, .probe = imx_wm8962_probe, .remove = imx_wm8962_remove, }; module_platform_driver(imx_wm8962_driver);
module_platform_driver(imx_wm8962_drvier) 展開:(platform_device.h)
#define module_platform_driver(__platform_driver) \ module_driver(__platform_driver, platform_driver_register, \ platform_driver_unregister) 所以 module_driver(imx_wm8962_driver, platform_driver_register, platform_driver_unregister)
module_driver 再展開..(device.h)
#define module_driver(__driver, __register, __unregister, ...) \ static int __init __driver##_init(void) \ { \ return __register(&(__driver) , ##__VA_ARGS__); \ } \ module_init(__driver##_init); \ static void __exit __driver##_exit(void) \ { \ __unregister(&(__driver) , ##__VA_ARGS__); \ } \ module_exit(__driver##_exit); 所以.. static int __init imx_wm8962_driver_init(void) { return platform_driver_register( &(imx_wm8962_driver) ); } module_init(imx_wm8962_driver_init)' static void __exit imx_wm8962_driver_exit(void) { platform_driver_unregister(&(imx_wm8962_driver)); } module_exit(imx_wm8962_exit);
最後的 macro : module_init, module_exit: (init.h)
#define module_init(x) __initcall(x); #define module_exit(x) __exitcall(x); 然後 #define __initcall(fn) device_initcall(fn) #define __exitcall(fn) \ static exitcall_t __exitcall_##fn __exit_call = fn
所以要去看 platform_driver_register ( platform.c )
int platform_driver_register(struct platform_driver *drv) { printk("%s -- %pS\n",__func__,__builtin_return_address(0)); drv->driver.bus = &platform_bus_type; if (drv->probe) drv->driver.probe = platform_drv_probe; if (drv->remove) drv->driver.remove = platform_drv_remove; if (drv->shutdown) drv->driver.shutdown = platform_drv_shutdown; return driver_register(&drv->driver); }他把 依照宣告的 platform_driver 變數內容,設定好 driver.driver 的資料,call driver_register( )
-- 其中 platform_drv_probe/remove/shutdown 也都在這個 source file 中。
driver_register -- bus_add_driver -- driver__attach -- driver_probe_device -- really_probe
bus: 'platform': driver_probe_device: matched device sound-wm8962.33 with driver imx-wm8962
log:
do_one_initcall imx_wm8962_driver_init platform_driver_register bus_add_driver ...
沒有留言:
張貼留言