123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- /* SPDX-License-Identifier: GPL-2.0+ */
- /*
- * Copyright (C) 2020 Sean Anderson <seanga2@gmail.com>
- * Copyright (c) 2013 Google, Inc
- *
- * (C) Copyright 2012
- * Pavel Herrmann <morpheus.ibis@gmail.com>
- * Marek Vasut <marex@denx.de>
- */
- #ifndef _DM_DEVICE_COMPAT_H
- #define _DM_DEVICE_COMPAT_H
- #include <log.h>
- #include <linux/build_bug.h>
- #include <linux/compat.h>
- /*
- * REVISIT:
- * remove the following after resolving conflicts with <linux/compat.h>
- */
- #ifdef dev_dbg
- #undef dev_dbg
- #endif
- #ifdef dev_vdbg
- #undef dev_vdbg
- #endif
- #ifdef dev_info
- #undef dev_info
- #endif
- #ifdef dev_err
- #undef dev_err
- #endif
- #ifdef dev_warn
- #undef dev_warn
- #endif
- /*
- * Define a new identifier which can be tested on by C code. A similar
- * definition is made for DEBUG in <log.h>.
- */
- #ifdef VERBOSE_DEBUG
- #define _VERBOSE_DEBUG 1
- #else
- #define _VERBOSE_DEBUG 0
- #endif
- /**
- * dev_printk_emit() - Emit a formatted log message
- * @cat: Category of the message
- * @level: Log level of the message
- * @fmt: Format string
- * @...: Arguments for @fmt
- *
- * This macro logs a message through the appropriate channel. It is a macro so
- * the if statements can be optimized out (as @level should be a constant known
- * at compile-time).
- *
- * If DEBUG or VERBOSE_DEBUG is defined, then some messages are always printed
- * (through printf()). This is to match the historical behavior of the dev_xxx
- * functions.
- *
- * If LOG is enabled, use log() to emit the message, otherwise print it based on
- * the console loglevel.
- */
- #define dev_printk_emit(cat, level, fmt, ...) \
- ({ \
- if ((_DEBUG && level == LOGL_DEBUG) || \
- (_VERBOSE_DEBUG && level == LOGL_DEBUG_CONTENT)) \
- printf(fmt, ##__VA_ARGS__); \
- else if (CONFIG_IS_ENABLED(LOG)) \
- log(cat, level, fmt, ##__VA_ARGS__); \
- else if (level < CONFIG_VAL(LOGLEVEL)) \
- printf(fmt, ##__VA_ARGS__); \
- })
- /**
- * __dev_printk() - Log a message for a device
- * @level: Log level of the message
- * @dev: A &struct udevice or &struct device
- * @fmt: Format string
- * @...: Arguments for @fmt
- *
- * This macro formats and prints dev_xxx log messages. It is done as a macro
- * because working with variadic argument is much easier this way, we can
- * interrogate the type of device we are passed (and whether it *is* a &struct
- * udevice or &struct device), and dev_printk_emit() can optimize out unused if
- * branches.
- *
- * Because this is a macro, we must enforce type checks ourselves. Ideally, we
- * would only accept udevices, but there is a significant amount of code (mostly
- * USB) which calls dev_xxx with &struct device. When assigning ``__dev``, we
- * must first cast ``dev`` to ``void *`` so we don't get warned when ``dev`` is
- * a &struct device. Even though the latter branch is not taken, it will still
- * get compiled and type-checked.
- *
- * The format strings in case of a ``NULL`` ``dev`` MUST be kept the same.
- * Otherwise, @fmt will be duplicated in the data section (with slightly
- * different prefixes). This is why ``(NULL udevice *)`` is printed as two
- * string arguments, and not by string pasting.
- */
- #define __dev_printk(level, dev, fmt, ...) \
- ({ \
- if (__same_type(dev, struct device *)) { \
- dev_printk_emit(LOG_CATEGORY, level, fmt, ##__VA_ARGS__); \
- } else { \
- BUILD_BUG_ON(!__same_type(dev, struct udevice *)); \
- struct udevice *__dev = (void *)dev; \
- if (__dev) \
- dev_printk_emit(__dev->driver->id, level, \
- "%s %s: " fmt, \
- __dev->driver->name, __dev->name, \
- ##__VA_ARGS__); \
- else \
- dev_printk_emit(LOG_CATEGORY, level, \
- "%s %s: " fmt, \
- "(NULL", "udevice *)", \
- ##__VA_ARGS__); \
- } \
- })
- #define dev_emerg(dev, fmt, ...) \
- __dev_printk(LOGL_EMERG, dev, fmt, ##__VA_ARGS__)
- #define dev_alert(dev, fmt, ...) \
- __dev_printk(LOGL_ALERT, dev, fmt, ##__VA_ARGS__)
- #define dev_crit(dev, fmt, ...) \
- __dev_printk(LOGL_CRIT, dev, fmt, ##__VA_ARGS__)
- #define dev_err(dev, fmt, ...) \
- __dev_printk(LOGL_ERR, dev, fmt, ##__VA_ARGS__)
- #define dev_warn(dev, fmt, ...) \
- __dev_printk(LOGL_WARNING, dev, fmt, ##__VA_ARGS__)
- #define dev_notice(dev, fmt, ...) \
- __dev_printk(LOGL_NOTICE, dev, fmt, ##__VA_ARGS__)
- #define dev_info(dev, fmt, ...) \
- __dev_printk(LOGL_INFO, dev, fmt, ##__VA_ARGS__)
- #define dev_dbg(dev, fmt, ...) \
- __dev_printk(LOGL_DEBUG, dev, fmt, ##__VA_ARGS__)
- #define dev_vdbg(dev, fmt, ...) \
- __dev_printk(LOGL_DEBUG_CONTENT, dev, fmt, ##__VA_ARGS__)
- #endif
|