Can request_firmware be called from a platform_driver ?
From: Dave Hylands <hidden>
Date: 2012-04-18 21:07:02
HI Mike, On Wed, Apr 18, 2012 at 1:24 PM, Holmes, Michael A (Mike) [off-list ref] wrote:
-----Original Message----- From: Dave Hylands [mailto:dhylands at gmail.com] Sent: Wednesday, April 18, 2012 3:15 PM To: Holmes, Michael A (Mike) Cc: kernelnewbies at kernelnewbies.org Subject: Re: Can request_firmware be called from a platform_driver ? Hi Mike, On Wed, Apr 18, 2012 at 11:07 AM, Holmes, Michael A (Mike) [off-list ref] wrote:quoted
Hi I have a fully working system to which I want to add the request firmware mechanism to an existing platform driver I have working. I instrumented mdev in busybox 1.5.1 and in firmware_class.c 2.6.35 so that I could figure this out. What I see with firmware_request() is that the kernel makes the firmware request and does not find any firmware and mdev sees nothing. However if I change my code to do request_firmare_nowait(), the entire system comes up and about 30seconds in the timeout calls my kernel side continue for request_firmare_nowait() and I DO now see my request handled by mdev, however it is a REMOVE request not the ADD request. All this makes me think that platform drivers exist before the hotplug mechanism is able to operate, is this true ?Well, request_firmware is ultimately serviced by a user-space process. So platform drivers compiled statically into the kernel get initialized long before user-space starts. Platform drivers compiled as modules will get the firmware loaded much more quickly after loading the module.quoted
quoted
quoted
quoted
quoted
quoted
quoted
quoted
Thanks Dave, Currently in make menuconfig I put '*' against it to compile it into the kernel, I made it an 'm' so that it is made as a module. For modules made outside the tree I call modprobe to load them, but I never made a module in the tree before, I don't know how to get its init called. When it was compiled in, I called the init from my machine init directly in my mach-lcp/arch.c via platform_device_register()
As far as init being called, this is identical for modules compiled as part of the kernel as it is for modules compiled out of tree. Normally, you would use module_init to specify a function to be called. This function will be called when a module is loaded (regardless of whether its compiled in or out of tree). For modules statically compiled into the kernel, module_init becomes the same as device_initcall. For code compiled as a module, all of the various xxx_initcall stuff gets translated to module_init See: include/linux/init.h -- Dave Hylands Shuswap, BC, Canada http://www.davehylands.com