Skip to content

Commit 412833b

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 0aad368 commit 412833b

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
@@ -3385,6 +3385,48 @@ define_dev_printk_level(_dev_info, KERN_INFO);
33853385

33863386
#endif
33873387

3388+
/**
3389+
* dev_err_probe - probe error check and log helper
3390+
* @dev: the pointer to the struct device
3391+
* @err: error value to test
3392+
* @fmt: printf-style format string
3393+
* @...: arguments as specified in the format string
3394+
*
3395+
* This helper implements common pattern present in probe functions for error
3396+
* checking: print debug or error message depending if the error value is
3397+
* -EPROBE_DEFER and propagate error upwards.
3398+
* It replaces code sequence:
3399+
* if (err != -EPROBE_DEFER)
3400+
* dev_err(dev, ...);
3401+
* else
3402+
* dev_dbg(dev, ...);
3403+
* return err;
3404+
* with
3405+
* return dev_err_probe(dev, err, ...);
3406+
*
3407+
* Returns @err.
3408+
*
3409+
*/
3410+
int dev_err_probe(const struct device *dev, int err, const char *fmt, ...)
3411+
{
3412+
struct va_format vaf;
3413+
va_list args;
3414+
3415+
va_start(args, fmt);
3416+
vaf.fmt = fmt;
3417+
vaf.va = &args;
3418+
3419+
if (err != -EPROBE_DEFER)
3420+
dev_err(dev, "error %d: %pV", err, &vaf);
3421+
else
3422+
dev_dbg(dev, "error %d: %pV", err, &vaf);
3423+
3424+
va_end(args);
3425+
3426+
return err;
3427+
}
3428+
EXPORT_SYMBOL_GPL(dev_err_probe);
3429+
33883430
static inline bool fwnode_is_primary(struct fwnode_handle *fwnode)
33893431
{
33903432
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)