Skip to content

Commit d3ddfc1

Browse files
Andrzej HajdaRobertCNelson
authored andcommitted
driver core: add device probe log helper
During probe every time driver gets resource it should usually check for error printk some message if it is not -EPROBE_DEFER and return the error. This pattern is simple but requires adding few lines after any resource acquisition code, as a result it is often omitted or implemented only partially. dev_err_probe helps to replace such code sequences with simple call, so code: if (err != -EPROBE_DEFER) dev_err(dev, ...); return err; becomes: return dev_err_probe(dev, err, ...); Signed-off-by: Andrzej Hajda <[email protected]> Reviewed-by: Rafael J. Wysocki <[email protected]> Reviewed-by: Mark Brown <[email protected]> Reviewed-by: Andy Shevchenko <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent d90c9ee commit d3ddfc1

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

drivers/base/core.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3398,6 +3398,48 @@ define_dev_printk_level(_dev_info, KERN_INFO);
33983398

33993399
#endif
34003400

3401+
/**
3402+
* dev_err_probe - probe error check and log helper
3403+
* @dev: the pointer to the struct device
3404+
* @err: error value to test
3405+
* @fmt: printf-style format string
3406+
* @...: arguments as specified in the format string
3407+
*
3408+
* This helper implements common pattern present in probe functions for error
3409+
* checking: print debug or error message depending if the error value is
3410+
* -EPROBE_DEFER and propagate error upwards.
3411+
* It replaces code sequence:
3412+
* if (err != -EPROBE_DEFER)
3413+
* dev_err(dev, ...);
3414+
* else
3415+
* dev_dbg(dev, ...);
3416+
* return err;
3417+
* with
3418+
* return dev_err_probe(dev, err, ...);
3419+
*
3420+
* Returns @err.
3421+
*
3422+
*/
3423+
int dev_err_probe(const struct device *dev, int err, const char *fmt, ...)
3424+
{
3425+
struct va_format vaf;
3426+
va_list args;
3427+
3428+
va_start(args, fmt);
3429+
vaf.fmt = fmt;
3430+
vaf.va = &args;
3431+
3432+
if (err != -EPROBE_DEFER)
3433+
dev_err(dev, "error %d: %pV", err, &vaf);
3434+
else
3435+
dev_dbg(dev, "error %d: %pV", err, &vaf);
3436+
3437+
va_end(args);
3438+
3439+
return err;
3440+
}
3441+
EXPORT_SYMBOL_GPL(dev_err_probe);
3442+
34013443
static inline bool fwnode_is_primary(struct fwnode_handle *fwnode)
34023444
{
34033445
return fwnode && !IS_ERR(fwnode->secondary);

include/linux/device.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1869,6 +1869,9 @@ do { \
18691869
WARN_ONCE(condition, "%s %s: " format, \
18701870
dev_driver_string(dev), dev_name(dev), ## arg)
18711871

1872+
extern __printf(3, 4)
1873+
int dev_err_probe(const struct device *dev, int err, const char *fmt, ...);
1874+
18721875
/* Create alias, so I can be autoloaded. */
18731876
#define MODULE_ALIAS_CHARDEV(major,minor) \
18741877
MODULE_ALIAS("char-major-" __stringify(major) "-" __stringify(minor))

0 commit comments

Comments
 (0)