Merge branches 'fixes' and 'fixes2' into devel-late
[firefly-linux-kernel-4.4.55.git] / drivers / base / core.c
index e28ce9898af4e1bab331fa3b9411b2bbc6575856..346be8b78b247e78fbe987fdfae435f8919cb2c6 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/mutex.h>
 #include <linux/async.h>
 #include <linux/pm_runtime.h>
+#include <linux/netdevice.h>
 
 #include "base.h"
 #include "power/power.h"
@@ -65,7 +66,7 @@ static inline int device_is_not_partition(struct device *dev)
  * @dev: struct device to get the name of
  *
  * Will return the device's driver's name if it is bound to a device.  If
- * the device is not bound to a device, it will return the name of the bus
+ * the device is not bound to a driver, it will return the name of the bus
  * it is attached to.  If it is not attached to a bus either, an empty
  * string will be returned.
  */
@@ -878,8 +879,8 @@ EXPORT_SYMBOL_GPL(dev_set_name);
  * to NULL prevents an entry from being created.  class->dev_kobj must
  * be set (or cleared) before any devices are registered to the class
  * otherwise device_create_sys_dev_entry() and
- * device_remove_sys_dev_entry() will disagree about the the presence
- * of the link.
+ * device_remove_sys_dev_entry() will disagree about the presence of
+ * the link.
  */
 static struct kobject *device_to_dev_kobj(struct device *dev)
 {
@@ -1843,15 +1844,60 @@ void device_shutdown(void)
  */
 
 #ifdef CONFIG_PRINTK
-
 int __dev_printk(const char *level, const struct device *dev,
                 struct va_format *vaf)
 {
+       char dict[128];
+       size_t dictlen = 0;
+       const char *subsys;
+
        if (!dev)
                return printk("%s(NULL device *): %pV", level, vaf);
 
-       return printk("%s%s %s: %pV",
-                     level, dev_driver_string(dev), dev_name(dev), vaf);
+       if (dev->class)
+               subsys = dev->class->name;
+       else if (dev->bus)
+               subsys = dev->bus->name;
+       else
+               goto skip;
+
+       dictlen += snprintf(dict + dictlen, sizeof(dict) - dictlen,
+                           "SUBSYSTEM=%s", subsys);
+
+       /*
+        * Add device identifier DEVICE=:
+        *   b12:8         block dev_t
+        *   c127:3        char dev_t
+        *   n8            netdev ifindex
+        *   +sound:card0  subsystem:devname
+        */
+       if (MAJOR(dev->devt)) {
+               char c;
+
+               if (strcmp(subsys, "block") == 0)
+                       c = 'b';
+               else
+                       c = 'c';
+               dictlen++;
+               dictlen += snprintf(dict + dictlen, sizeof(dict) - dictlen,
+                                  "DEVICE=%c%u:%u",
+                                  c, MAJOR(dev->devt), MINOR(dev->devt));
+       } else if (strcmp(subsys, "net") == 0) {
+               struct net_device *net = to_net_dev(dev);
+
+               dictlen++;
+               dictlen += snprintf(dict + dictlen, sizeof(dict) - dictlen,
+                                   "DEVICE=n%u", net->ifindex);
+       } else {
+               dictlen++;
+               dictlen += snprintf(dict + dictlen, sizeof(dict) - dictlen,
+                                   "DEVICE=+%s:%s", subsys, dev_name(dev));
+       }
+skip:
+       return printk_emit(0, level[1] - '0',
+                          dictlen ? dict : NULL, dictlen,
+                          "%s %s: %pV",
+                          dev_driver_string(dev), dev_name(dev), vaf);
 }
 EXPORT_SYMBOL(__dev_printk);