Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
I'm working on an embedded Linux device (based on an NXP i.MX8 mini SoC) and it needs to support microphone audio input using the NXP "micfil" driver (sound/soc/fsl/fsl_micfil.c).
As a part of initializing the microphone, we have added code (to the driver's
fsl_micfil_probe
function) to set a GPIO line necessary to enable the microphone (by calling
devm_gpiod_get_optional
)
Our current Linux BSP (based on Yocto's "sumo" release) works great with this patch.
When upgrading to a newer BSP (based on Yocto's "hardknott" release), we find that the GPIO setup call fails. It appears to be happening because the driver's probe function is called before the GPIO subsystem is available. I think we can hack around this by making the GPIO call from some other driver callback (e.g. after an application opens the device), but I would prefer to simply defer this driver's probe operation until after GPIO is available.
Is there a way to do this? To tell Linux that this driver should not be probed until after GPIO starts up? Or maybe have the probe function explicitly call the GPIO startup function?
Or is there a better solution that I haven't thought of yet?
The device driver's probe function can return
-EPROBE_DEFER
(after any necessary clean-up) to indicate that a resource it requires is not available yet. The driver core will then add the device to a "deferred probe" list and try to call the probe function after a successful probe of some other device.
See the
documentation
for further information, and heed the warning about not returning
-EPROBE_DEFER
if any child devices have been created by the probe function.
devm_gpiod_get_optional
and similar
devm_gpiod_get_
and
gpiod_get_
functions that return a
struct gpio_desc *
value will return
ERR_PTR(-EPROBE_DEFER)
if the requested GPIO is not yet available. (This is different to the GPIO not being found, which will result in the
_optional
variants returning
NULL
and the non-
_optional
variants returning
ERR_PTR(-ENOENT)
.) The caller can propogate the
-EPROBE_DEFER
error to its own caller, but again the warning about not returning
-EPROBE_DEFER
if any child devices have been created should be heeded.
–
Thanks for contributing an answer to Stack Overflow!
-
Please be sure to
answer the question
. Provide details and share your research!
But
avoid
…
-
Asking for help, clarification, or responding to other answers.
-
Making statements based on opinion; back them up with references or personal experience.
To learn more, see our
tips on writing great answers
.