struct i2c_client *client = priv->client;
        u8 chan;
        u16 val;
+       int ret;
 
        if (id >= TPS23881_MAX_CHANS)
                return -ERANGE;
                                       BIT(chan % 4));
        }
 
-       return i2c_smbus_write_word_data(client, TPS23881_REG_PW_EN, val);
+       ret = i2c_smbus_write_word_data(client, TPS23881_REG_PW_EN, val);
+       if (ret)
+               return ret;
+
+       /* PWOFF command resets lots of register which need to be
+        * configured again. According to the datasheet "It may take upwards
+        * of 5ms after PWOFFn command for all register values to be updated"
+        */
+       mdelay(5);
+
+       /* Enable detection and classification */
+       ret = i2c_smbus_read_word_data(client, TPS23881_REG_DET_CLA_EN);
+       if (ret < 0)
+               return ret;
+
+       chan = priv->port[id].chan[0];
+       val = tps23881_set_val(ret, chan, 0, BIT(chan % 4), BIT(chan % 4));
+       val = tps23881_set_val(val, chan, 4, BIT(chan % 4), BIT(chan % 4));
+
+       if (priv->port[id].is_4p) {
+               chan = priv->port[id].chan[1];
+               val = tps23881_set_val(ret, chan, 0, BIT(chan % 4),
+                                      BIT(chan % 4));
+               val = tps23881_set_val(val, chan, 4, BIT(chan % 4),
+                                      BIT(chan % 4));
+       }
+
+       return i2c_smbus_write_word_data(client, TPS23881_REG_DET_CLA_EN, val);
 }
 
 static int tps23881_pi_is_enabled(struct pse_controller_dev *pcdev, int id)