static unsigned int i2c_debug;
 module_param(i2c_debug, int, 0644);
-MODULE_PARM_DESC(i2c_debug, "enable debug messages [i2c]");
+MODULE_PARM_DESC(i2c_debug, "i2c debug message level (1: normal debug, 2: show I2C transfers)");
 
 /*
  * em2800_i2c_send_bytes()
                }
                msleep(5);
        }
-       em28xx_warn("write to i2c device at 0x%x timed out\n", addr);
+       if (i2c_debug)
+               em28xx_warn("write to i2c device at 0x%x timed out\n", addr);
        return -ETIMEDOUT;
 }
 
                }
                msleep(5);
        }
-       if (ret != 0x84 + len - 1)
-               em28xx_warn("read from i2c device at 0x%x timed out\n", addr);
+       if (ret != 0x84 + len - 1) {
+               if (i2c_debug)
+                       em28xx_warn("read from i2c device at 0x%x timed out\n",
+                                   addr);
+       }
 
        /* get the received message */
        ret = dev->em28xx_read_reg_req_len(dev, 0x00, 4-len, buf2, len);
                 * (even with high payload) ...
                 */
        }
-       em28xx_warn("write to i2c device at 0x%x timed out (status=%i)\n", addr, ret);
+       if (i2c_debug)
+               em28xx_warn("write to i2c device at 0x%x timed out (status=%i)\n",
+                           addr, ret);
        return -ETIMEDOUT;
 }
 
                rc = em2800_i2c_check_for_device(dev, addr);
        else if (i2c_bus->algo_type == EM28XX_I2C_ALGO_EM25XX_BUS_B)
                rc = em25xx_bus_B_check_for_device(dev, addr);
-       if (rc == -ENXIO) {
-               if (i2c_debug)
-                       printk(" no device\n");
-       }
        return rc;
 }
 
 {
        struct em28xx *dev = i2c_bus->dev;
        u16 addr = msg.addr << 1;
-       int byte, rc = -EOPNOTSUPP;
+       int rc = -EOPNOTSUPP;
 
        if (i2c_bus->algo_type == EM28XX_I2C_ALGO_EM28XX)
                rc = em28xx_i2c_recv_bytes(dev, addr, msg.buf, msg.len);
                rc = em2800_i2c_recv_bytes(dev, addr, msg.buf, msg.len);
        else if (i2c_bus->algo_type == EM28XX_I2C_ALGO_EM25XX_BUS_B)
                rc = em25xx_bus_B_recv_bytes(dev, addr, msg.buf, msg.len);
-       if (i2c_debug) {
-               for (byte = 0; byte < msg.len; byte++)
-                       printk(" %02x", msg.buf[byte]);
-       }
        return rc;
 }
 
 {
        struct em28xx *dev = i2c_bus->dev;
        u16 addr = msg.addr << 1;
-       int byte, rc = -EOPNOTSUPP;
+       int rc = -EOPNOTSUPP;
 
-       if (i2c_debug) {
-               for (byte = 0; byte < msg.len; byte++)
-                       printk(" %02x", msg.buf[byte]);
-       }
        if (i2c_bus->algo_type == EM28XX_I2C_ALGO_EM28XX)
                rc = em28xx_i2c_send_bytes(dev, addr, msg.buf, msg.len, stop);
        else if (i2c_bus->algo_type == EM28XX_I2C_ALGO_EM2800)
        }
        for (i = 0; i < num; i++) {
                addr = msgs[i].addr << 1;
-               if (i2c_debug)
+               if (i2c_debug > 1)
                        printk(KERN_DEBUG "%s at %s: %s %s addr=%02x len=%d:",
                               dev->name, __func__ ,
                               (msgs[i].flags & I2C_M_RD) ? "read" : "write",
                         * This code is only called during device probe.
                         */
                        rc = i2c_check_for_device(i2c_bus, addr);
-                       if (rc == -ENXIO) {
+                       if (rc < 0) {
+                               if (rc == -ENXIO) {
+                                       if (i2c_debug > 1)
+                                               printk(KERN_CONT " no device\n");
+                                       rc = -ENODEV;
+                               } else {
+                                       if (i2c_debug > 1)
+                                               printk(KERN_CONT " ERROR: %i\n", rc);
+                               }
                                rt_mutex_unlock(&dev->i2c_bus_lock);
-                               return -ENODEV;
+                               return rc;
                        }
                } else if (msgs[i].flags & I2C_M_RD) {
                        /* read bytes */
                        rc = i2c_recv_bytes(i2c_bus, msgs[i]);
+
+                       if (i2c_debug > 1 && rc >= 0)
+                               printk(KERN_CONT " %*ph",
+                                      msgs[i].len, msgs[i].buf);
                } else {
+                       if (i2c_debug > 1)
+                               printk(KERN_CONT " %*ph",
+                                      msgs[i].len, msgs[i].buf);
+
                        /* write bytes */
                        rc = i2c_send_bytes(i2c_bus, msgs[i], i == num - 1);
                }
                if (rc < 0) {
-                       if (i2c_debug)
-                               printk(" ERROR: %i\n", rc);
+                       if (i2c_debug > 1)
+                               printk(KERN_CONT " ERROR: %i\n", rc);
                        rt_mutex_unlock(&dev->i2c_bus_lock);
                        return rc;
                }
-               if (i2c_debug)
-                       printk("\n");
+               if (i2c_debug > 1)
+                       printk(KERN_CONT "\n");
        }
 
        rt_mutex_unlock(&dev->i2c_bus_lock);
         * calculation and returned device dataset. Simplifies the code a lot,
         * but we might have to deal with multiple sizes in the future !
         */
-       int i, err;
+       int err;
        struct em28xx_eeprom *dev_config;
        u8 buf, *data;
 
                goto error;
        }
 
-       /* Display eeprom content */
-       for (i = 0; i < len; i++) {
-               if (0 == (i % 16)) {
-                       if (dev->eeprom_addrwidth_16bit)
-                               em28xx_info("i2c eeprom %04x:", i);
-                       else
-                               em28xx_info("i2c eeprom %02x:", i);
-               }
-               printk(" %02x", data[i]);
-               if (15 == (i % 16))
-                       printk("\n");
+       if (i2c_debug) {
+               /* Display eeprom content */
+               print_hex_dump(KERN_INFO, "eeprom ", DUMP_PREFIX_OFFSET,
+                              16, 1, data, len, true);
+
+               if (dev->eeprom_addrwidth_16bit)
+                       em28xx_info("eeprom %06x: ... (skipped)\n", 256);
        }
-       if (dev->eeprom_addrwidth_16bit)
-               em28xx_info("i2c eeprom %04x: ... (skipped)\n", i);
 
        if (dev->eeprom_addrwidth_16bit &&
            data[0] == 0x26 && data[3] == 0x00) {