_pcd->conn_status++;
if (pldata->bc_detect_cb != NULL) {
pldata->bc_detect_cb(_pcd->vbus_status =
- USB_BC_TYPE_DCP);
+ usb_battery_charger_detect(1));
} else {
_pcd->vbus_status = USB_BC_TYPE_DCP;
}
{
enum bc_port_type port_type = USB_BC_TYPE_DISCNT;
int dcd_state = DCD_POSITIVE;
- int timeout = 0, i = 0;
+ int timeout = 0, i = 0, filted_cpdet = 0;
/* VBUS Valid detect */
if (BC_GET(INNO_BC_BVALID) &&
BC_SET(INNO_BC_IDMSINKEN, 1);
udelay(T_BC_CHGDET_VALID);
+ /*
+ * Filter for Primary Detection,
+ * double check CPDET field
+ */
+ timeout = T_BC_CHGDET_VALID;
+ while(timeout--) {
+ /*
+ * In rapidly hotplug case, it's more likely to
+ * distinguish SDP as DCP/CDP because of line
+ * bounce
+ */
+ filted_cpdet += (BC_GET(INNO_BC_CPDET) ? 1 : -2);
+ udelay(1);
+ }
/* SDP and CDP/DCP distinguish */
- if (BC_GET(INNO_BC_CPDET)) {
+ if (filted_cpdet > 0) {
/* Turn off VDPSRC */
BC_SET(INNO_BC_VDPSRCEN, 0);
BC_SET(INNO_BC_IDMSINKEN, 0);