device_compat.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. /*
  3. * Copyright (C) 2020 Sean Anderson <seanga2@gmail.com>
  4. * Copyright (c) 2013 Google, Inc
  5. *
  6. * (C) Copyright 2012
  7. * Pavel Herrmann <morpheus.ibis@gmail.com>
  8. * Marek Vasut <marex@denx.de>
  9. */
  10. #ifndef _DM_DEVICE_COMPAT_H
  11. #define _DM_DEVICE_COMPAT_H
  12. #include <log.h>
  13. #include <linux/build_bug.h>
  14. #include <linux/compat.h>
  15. /*
  16. * Define a new identifier which can be tested on by C code. A similar
  17. * definition is made for DEBUG in <log.h>.
  18. */
  19. #ifdef VERBOSE_DEBUG
  20. #define _VERBOSE_DEBUG 1
  21. #else
  22. #define _VERBOSE_DEBUG 0
  23. #endif
  24. /**
  25. * dev_printk_emit() - Emit a formatted log message
  26. * @cat: Category of the message
  27. * @level: Log level of the message
  28. * @fmt: Format string
  29. * @...: Arguments for @fmt
  30. *
  31. * This macro logs a message through the appropriate channel. It is a macro so
  32. * the if statements can be optimized out (as @level should be a constant known
  33. * at compile-time).
  34. *
  35. * If DEBUG or VERBOSE_DEBUG is defined, then some messages are always printed
  36. * (through printf()). This is to match the historical behavior of the dev_xxx
  37. * functions.
  38. *
  39. * If LOG is enabled, use log() to emit the message, otherwise print it based on
  40. * the console loglevel.
  41. */
  42. #define dev_printk_emit(cat, level, fmt, ...) \
  43. ({ \
  44. if ((_DEBUG && level == LOGL_DEBUG) || \
  45. (_VERBOSE_DEBUG && level == LOGL_DEBUG_CONTENT)) \
  46. printf(fmt, ##__VA_ARGS__); \
  47. else if (CONFIG_IS_ENABLED(LOG)) \
  48. log(cat, level, fmt, ##__VA_ARGS__); \
  49. else if (level < CONFIG_VAL(LOGLEVEL)) \
  50. printf(fmt, ##__VA_ARGS__); \
  51. })
  52. /**
  53. * __dev_printk() - Log a message for a device
  54. * @level: Log level of the message
  55. * @dev: A &struct udevice or &struct device
  56. * @fmt: Format string
  57. * @...: Arguments for @fmt
  58. *
  59. * This macro formats and prints dev_xxx log messages. It is done as a macro
  60. * because working with variadic argument is much easier this way, we can
  61. * interrogate the type of device we are passed (and whether it *is* a &struct
  62. * udevice or &struct device), and dev_printk_emit() can optimize out unused if
  63. * branches.
  64. *
  65. * Because this is a macro, we must enforce type checks ourselves. Ideally, we
  66. * would only accept udevices, but there is a significant amount of code (mostly
  67. * USB) which calls dev_xxx with &struct device. When assigning ``__dev``, we
  68. * must first cast ``dev`` to ``void *`` so we don't get warned when ``dev`` is
  69. * a &struct device. Even though the latter branch is not taken, it will still
  70. * get compiled and type-checked.
  71. *
  72. * The format strings in case of a ``NULL`` ``dev`` MUST be kept the same.
  73. * Otherwise, @fmt will be duplicated in the data section (with slightly
  74. * different prefixes). This is why ``(NULL udevice *)`` is printed as two
  75. * string arguments, and not by string pasting.
  76. */
  77. #define __dev_printk(level, dev, fmt, ...) \
  78. ({ \
  79. if (__same_type(dev, struct device *)) { \
  80. dev_printk_emit(LOG_CATEGORY, level, fmt, ##__VA_ARGS__); \
  81. } else { \
  82. BUILD_BUG_ON(!__same_type(dev, struct udevice *)); \
  83. struct udevice *__dev = (void *)dev; \
  84. if (__dev) \
  85. dev_printk_emit(__dev->driver->id, level, \
  86. "%s %s: " fmt, \
  87. __dev->driver->name, __dev->name, \
  88. ##__VA_ARGS__); \
  89. else \
  90. dev_printk_emit(LOG_CATEGORY, level, \
  91. "%s %s: " fmt, \
  92. "(NULL", "udevice *)", \
  93. ##__VA_ARGS__); \
  94. } \
  95. })
  96. #define dev_emerg(dev, fmt, ...) \
  97. __dev_printk(LOGL_EMERG, dev, fmt, ##__VA_ARGS__)
  98. #define dev_alert(dev, fmt, ...) \
  99. __dev_printk(LOGL_ALERT, dev, fmt, ##__VA_ARGS__)
  100. #define dev_crit(dev, fmt, ...) \
  101. __dev_printk(LOGL_CRIT, dev, fmt, ##__VA_ARGS__)
  102. #define dev_err(dev, fmt, ...) \
  103. __dev_printk(LOGL_ERR, dev, fmt, ##__VA_ARGS__)
  104. #define dev_warn(dev, fmt, ...) \
  105. __dev_printk(LOGL_WARNING, dev, fmt, ##__VA_ARGS__)
  106. #define dev_notice(dev, fmt, ...) \
  107. __dev_printk(LOGL_NOTICE, dev, fmt, ##__VA_ARGS__)
  108. #define dev_info(dev, fmt, ...) \
  109. __dev_printk(LOGL_INFO, dev, fmt, ##__VA_ARGS__)
  110. #define dev_dbg(dev, fmt, ...) \
  111. __dev_printk(LOGL_DEBUG, dev, fmt, ##__VA_ARGS__)
  112. #define dev_vdbg(dev, fmt, ...) \
  113. __dev_printk(LOGL_DEBUG_CONTENT, dev, fmt, ##__VA_ARGS__)
  114. #endif