USB: fix Coding Style.
[firefly-linux-kernel-4.4.55.git] / drivers / usb / dwc_otg_310 / usbdev_bc.c
old mode 100644 (file)
new mode 100755 (executable)
index 262d8d1..d7443ad
 /****** GET and SET REGISTER FIELDS IN GRF UOC ******/
 
 #define BC_GET(x) grf_uoc_get_field(&pBC_UOC_FIELDS[x])
-#define BC_SET(x,v) grf_uoc_set_field(&pBC_UOC_FIELDS[x], v)
+#define BC_SET(x, v) grf_uoc_set_field(&pBC_UOC_FIELDS[x], v)
 
-uoc_field_t *pBC_UOC_FIELDS = NULL;
-static void *pGRF_BASE = NULL;
+uoc_field_t *pBC_UOC_FIELDS;
+static void *pGRF_BASE;
+int rk_usb_charger_status = USB_BC_TYPE_DISCNT;
 
 /****** GET REGISTER FIELD INFO FROM Device Tree ******/
 
-inline static void *get_grf_base(struct device_node *np)
+static inline void *get_grf_base(struct device_node *np)
 {
-    void *grf_base = of_iomap(of_get_parent(np), 0);
-    if(of_machine_is_compatible("rockchip,rk3188"))
-        return (grf_base - 0xac);
-    else if(of_machine_is_compatible("rockchip,rk3288"))
-        return (grf_base - 0x284);
-}
+       void *grf_base = of_iomap(of_get_parent(np), 0);
+
+       if (of_machine_is_compatible("rockchip,rk3188"))
+               grf_base -= 0xac;
+       else if (of_machine_is_compatible("rockchip,rk3288"))
+               grf_base -= 0x284;
 
+       return grf_base;
+}
 
 void grf_uoc_set_field(uoc_field_t *field, u32 value)
 {
-    if(!uoc_field_valid(field))
-        return ;
-    grf_uoc_set(pGRF_BASE, field->b.offset, field->b.bitmap, field->b.mask, value);
+       if (!uoc_field_valid(field))
+               return;
+       grf_uoc_set(pGRF_BASE, field->b.offset, field->b.bitmap, field->b.mask,
+                   value);
 }
 
 u32 grf_uoc_get_field(uoc_field_t *field)
 {
-    return grf_uoc_get(pGRF_BASE, field->b.offset, field->b.bitmap, field->b.mask);
+       return grf_uoc_get(pGRF_BASE, field->b.offset, field->b.bitmap,
+                          field->b.mask);
 }
 
-inline static int uoc_init_field(struct device_node *np, const char* name, uoc_field_t *f)
+static inline int uoc_init_field(struct device_node *np, const char *name,
+                                uoc_field_t *f)
 {
-    of_property_read_u32_array(np, name, f->array, 3);
-    printk("usb battery charger detect: uoc_init_field: 0x%08x %d %d \n",f->b.offset,f->b.bitmap,f->b.mask);
-    return 0;
+       of_property_read_u32_array(np, name, f->array, 3);
+       /* printk("usb battery charger detect: uoc_init_field: 0x%08x %d %d \n",
+        *        f->b.offset,f->b.bitmap,f->b.mask);*/
+       return 0;
 }
-inline static void uoc_init_synop(struct device_node *np)
+
+static inline void uoc_init_synop(struct device_node *np)
 {
-    pBC_UOC_FIELDS = (uoc_field_t *)kzalloc(SYNOP_BC_MAX * sizeof(uoc_field_t), GFP_ATOMIC);
-
-    uoc_init_field(np, "rk_usb,bvalid", &pBC_UOC_FIELDS[SYNOP_BC_BVALID]);
-    uoc_init_field(np, "rk_usb,dcdenb", &pBC_UOC_FIELDS[SYNOP_BC_DCDENB]);
-    uoc_init_field(np, "rk_usb,vdatsrcenb", &pBC_UOC_FIELDS[SYNOP_BC_VDATSRCENB]);
-    uoc_init_field(np, "rk_usb,vdatdetenb", &pBC_UOC_FIELDS[SYNOP_BC_VDATDETENB]);
-    uoc_init_field(np, "rk_usb,chrgsel",  &pBC_UOC_FIELDS[SYNOP_BC_CHRGSEL]);
-    uoc_init_field(np, "rk_usb,chgdet",   &pBC_UOC_FIELDS[SYNOP_BC_CHGDET]);
+       pBC_UOC_FIELDS =
+           (uoc_field_t *) kzalloc(SYNOP_BC_MAX * sizeof(uoc_field_t),
+                                   GFP_ATOMIC);
+
+       uoc_init_field(np, "rk_usb,bvalid", &pBC_UOC_FIELDS[SYNOP_BC_BVALID]);
+       uoc_init_field(np, "rk_usb,dcdenb", &pBC_UOC_FIELDS[SYNOP_BC_DCDENB]);
+       uoc_init_field(np, "rk_usb,vdatsrcenb",
+                      &pBC_UOC_FIELDS[SYNOP_BC_VDATSRCENB]);
+       uoc_init_field(np, "rk_usb,vdatdetenb",
+                      &pBC_UOC_FIELDS[SYNOP_BC_VDATDETENB]);
+       uoc_init_field(np, "rk_usb,chrgsel", &pBC_UOC_FIELDS[SYNOP_BC_CHRGSEL]);
+       uoc_init_field(np, "rk_usb,chgdet", &pBC_UOC_FIELDS[SYNOP_BC_CHGDET]);
+       uoc_init_field(np, "rk_usb,fsvplus", &pBC_UOC_FIELDS[SYNOP_BC_FSVPLUS]);
+       uoc_init_field(np, "rk_usb,fsvminus",
+                      &pBC_UOC_FIELDS[SYNOP_BC_FSVMINUS]);
 }
 
-inline static void uoc_init_rk(struct device_node *np)
+static inline void uoc_init_rk(struct device_node *np)
 {
-    pBC_UOC_FIELDS = (uoc_field_t *)kzalloc(RK_BC_MAX * sizeof(uoc_field_t), GFP_ATOMIC);
-
-    uoc_init_field(np, "rk_usb,bvalid",   &pBC_UOC_FIELDS[RK_BC_BVALID]);
-    uoc_init_field(np, "rk_usb,line",     &pBC_UOC_FIELDS[RK_BC_LINESTATE]);
-    uoc_init_field(np, "rk_usb,softctrl", &pBC_UOC_FIELDS[RK_BC_SOFTCTRL]);
-    uoc_init_field(np, "rk_usb,opmode",   &pBC_UOC_FIELDS[RK_BC_OPMODE]);
-    uoc_init_field(np, "rk_usb,xcvrsel",  &pBC_UOC_FIELDS[RK_BC_XCVRSELECT]);
-    uoc_init_field(np, "rk_usb,termsel",  &pBC_UOC_FIELDS[RK_BC_TERMSELECT]);
+       pBC_UOC_FIELDS =
+           (uoc_field_t *) kzalloc(RK_BC_MAX * sizeof(uoc_field_t),
+                                   GFP_ATOMIC);
+
+       uoc_init_field(np, "rk_usb,bvalid", &pBC_UOC_FIELDS[RK_BC_BVALID]);
+       uoc_init_field(np, "rk_usb,line", &pBC_UOC_FIELDS[RK_BC_LINESTATE]);
+       uoc_init_field(np, "rk_usb,softctrl", &pBC_UOC_FIELDS[RK_BC_SOFTCTRL]);
+       uoc_init_field(np, "rk_usb,opmode", &pBC_UOC_FIELDS[RK_BC_OPMODE]);
+       uoc_init_field(np, "rk_usb,xcvrsel", &pBC_UOC_FIELDS[RK_BC_XCVRSELECT]);
+       uoc_init_field(np, "rk_usb,termsel", &pBC_UOC_FIELDS[RK_BC_TERMSELECT]);
 }
 
-inline static void uoc_init_inno(struct device_node *np)
+static inline void uoc_init_inno(struct device_node *np)
 {
-    ;
+       ;
 }
 
 /****** BATTERY CHARGER DETECT FUNCTIONS ******/
@@ -88,142 +105,180 @@ inline static void uoc_init_inno(struct device_node *np)
 int usb_battery_charger_detect_rk(bool wait)
 {
 
-    int port_type = USB_BC_TYPE_DISCNT;
-    
-    if(BC_GET(RK_BC_BVALID))
-    {   
-        mdelay(10);
-        BC_SET(RK_BC_SOFTCTRL, 1);
-        BC_SET(RK_BC_OPMODE, 0);
-        BC_SET(RK_BC_XCVRSELECT, 1);
-        BC_SET(RK_BC_TERMSELECT, 1);
-        
-        mdelay(1);
-        switch (BC_GET(RK_BC_LINESTATE))
-        {
-            case 1:
-                port_type = USB_BC_TYPE_SDP;
-                break;
-                
-            case 3:
-                port_type = USB_BC_TYPE_DCP;
-                break;
-                
-            default:
-                port_type = USB_BC_TYPE_SDP;
-                printk("%s linestate = %d bad status\n", __func__, BC_GET(RK_BC_LINESTATE));
-        }
-        
-    }
-    BC_SET(RK_BC_SOFTCTRL, 0);    
-    
-    printk("%s , battery_charger_detect %d\n", __func__, port_type);
-    return port_type;
+       int port_type = USB_BC_TYPE_DISCNT;
+
+       if (BC_GET(RK_BC_BVALID)) {
+               mdelay(10);
+               BC_SET(RK_BC_SOFTCTRL, 1);
+               BC_SET(RK_BC_OPMODE, 0);
+               BC_SET(RK_BC_XCVRSELECT, 1);
+               BC_SET(RK_BC_TERMSELECT, 1);
+
+               mdelay(1);
+               switch (BC_GET(RK_BC_LINESTATE)) {
+               case 1:
+                       port_type = USB_BC_TYPE_SDP;
+                       break;
+
+               case 3:
+                       port_type = USB_BC_TYPE_DCP;
+                       break;
+
+               default:
+                       port_type = USB_BC_TYPE_SDP;
+                       /* printk("%s linestate = %d bad status\n",
+                        *        __func__, BC_GET(RK_BC_LINESTATE)); */
+               }
+
+       }
+       BC_SET(RK_BC_SOFTCTRL, 0);
+
+       /* printk("%s , battery_charger_detect %d\n",
+        *        __func__, port_type); */
+       return port_type;
 }
 
 int usb_battery_charger_detect_inno(bool wait)
 {
 
-    return -1;
+       return -1;
 }
 
 /* When do BC detect PCD pull-up register should be disabled  */
-//wait wait for dcd timeout 900ms
+/* wait wait for dcd timeout 900ms */
 int usb_battery_charger_detect_synop(bool wait)
 {
-    int port_type = USB_BC_TYPE_DISCNT;
-    int timeout;
-    //VBUS Valid detect
-
-    if(BC_GET(SYNOP_BC_BVALID)) {
-        //todo : add DCD !
-        mdelay(wait ? T_DCD_TIMEOUT : 1);
-
-        /* Turn on VDPSRC */
-        //Primary Detection
-        BC_SET(SYNOP_BC_VDATSRCENB, 1);
-        BC_SET(SYNOP_BC_VDATDETENB, 1);
-        BC_SET(SYNOP_BC_CHRGSEL, 0);
-
-        timeout = T_BC_WAIT_CHGDET;
-        while(timeout--) {
-            if(BC_GET(SYNOP_BC_CHGDET))
-                break;
-            mdelay(1);
-        }
-
-        /* SDP and CDP/DCP distinguish */
-        if(BC_GET(SYNOP_BC_CHGDET)) {
-            /* Turn off VDPSRC */
-            BC_SET(SYNOP_BC_VDATSRCENB, 0);
-            BC_SET(SYNOP_BC_VDATDETENB, 0);
-
-            timeout = T_BC_SRC_OFF;
-            while(timeout--) {
-                if(!BC_GET(SYNOP_BC_CHGDET))
-                    break;
-                mdelay(1);
-            };
-
-            /* Turn on VDMSRC */
-            BC_SET(SYNOP_BC_VDATSRCENB, 1);
-            BC_SET(SYNOP_BC_VDATDETENB, 1);
-            BC_SET(SYNOP_BC_CHRGSEL, 1);
-
-            if(BC_GET(SYNOP_BC_CHGDET))
-                port_type = USB_BC_TYPE_DCP;
-            else
-                port_type = USB_BC_TYPE_CDP;
-        } else {
-            port_type = USB_BC_TYPE_SDP;
-        }
-        BC_SET(SYNOP_BC_VDATSRCENB, 0);
-        BC_SET(SYNOP_BC_VDATDETENB, 0);
-        BC_SET(SYNOP_BC_CHRGSEL, 0);
-
-    }
-
-    printk("%s , battery_charger_detect %d\n", __func__, port_type);
-    return port_type;
+       int port_type = USB_BC_TYPE_DISCNT;
+       int dcd_state;
+       int timeout = 0, i = 0;
+       /* VBUS Valid detect */
+       if (BC_GET(SYNOP_BC_BVALID)) {
+               if (wait) {
+                       /* Do DCD */
+                       dcd_state = DCD_TIMEOUT;
+                       BC_SET(SYNOP_BC_DCDENB, 1);
+                       timeout = T_DCD_TIMEOUT;
+                       while (timeout--) {
+                               if (!BC_GET(SYNOP_BC_FSVPLUS))
+                                       i++;
+                               if (i >= 3) {
+                                       /* It is a filter here to assure data
+                                        * lines contacted for at least 3ms */
+                                       dcd_state = DCD_POSITIVE;
+                                       break;
+                               }
+
+                               mdelay(1);
+                       }
+                       BC_SET(SYNOP_BC_DCDENB, 0);
+               } else {
+                       dcd_state = DCD_PASSED;
+               }
+               if (dcd_state == DCD_TIMEOUT) {
+                       port_type = USB_BC_TYPE_UNKNOW;
+                       goto out;
+               }
+
+               /* Turn on VDPSRC */
+               /* Primary Detection */
+               BC_SET(SYNOP_BC_VDATSRCENB, 1);
+               BC_SET(SYNOP_BC_VDATDETENB, 1);
+               BC_SET(SYNOP_BC_CHRGSEL, 0);
+
+               udelay(T_BC_CHGDET_VALID);
+
+               /* SDP and CDP/DCP distinguish */
+               if (BC_GET(SYNOP_BC_CHGDET)) {
+                       /* Turn off VDPSRC */
+                       BC_SET(SYNOP_BC_VDATSRCENB, 0);
+                       BC_SET(SYNOP_BC_VDATDETENB, 0);
+
+                       udelay(T_BC_CHGDET_VALID);
+
+                       /* Turn on VDMSRC */
+                       BC_SET(SYNOP_BC_VDATSRCENB, 1);
+                       BC_SET(SYNOP_BC_VDATDETENB, 1);
+                       BC_SET(SYNOP_BC_CHRGSEL, 1);
+                       udelay(T_BC_CHGDET_VALID);
+                       if (BC_GET(SYNOP_BC_CHGDET))
+                               port_type = USB_BC_TYPE_DCP;
+                       else
+                               port_type = USB_BC_TYPE_CDP;
+               } else {
+                       port_type = USB_BC_TYPE_SDP;
+               }
+               BC_SET(SYNOP_BC_VDATSRCENB, 0);
+               BC_SET(SYNOP_BC_VDATDETENB, 0);
+               BC_SET(SYNOP_BC_CHRGSEL, 0);
+
+       }
+out:
+       printk("%s , battery_charger_detect %d, %s DCD, dcd_state = %d\n",
+              __func__, port_type, wait ? "wait" : "pass", dcd_state);
+       return port_type;
 }
 
 int usb_battery_charger_detect(bool wait)
 {
-    static struct device_node *np = NULL;
-    if(!np)
-        np = of_find_node_by_name(NULL, "usb_bc");
-    if(!np)
-        goto fail;
-    if(!pGRF_BASE) {
-        pGRF_BASE = get_grf_base(np);
-    }
-
-    if(of_device_is_compatible(np,"rockchip,ctrl")) {
-        if(!pBC_UOC_FIELDS)
-            uoc_init_rk(np);
-        return usb_battery_charger_detect_rk(wait);
-    }
-
-    else if(of_device_is_compatible(np,"synopsys,phy")) {
-        if(!pBC_UOC_FIELDS)
-            uoc_init_synop(np);
-        return usb_battery_charger_detect_synop(wait);
-    }
-
-    else if(of_device_is_compatible(np,"inno,phy")) {
-        if(!pBC_UOC_FIELDS)
-            uoc_init_inno(np);
-        return usb_battery_charger_detect_inno(wait);
-    }
+       static struct device_node *np;
+       if (!np)
+               np = of_find_node_by_name(NULL, "usb_bc");
+       if (!np)
+               goto fail;
+       if (!pGRF_BASE)
+               pGRF_BASE = get_grf_base(np);
+
+       if (of_device_is_compatible(np, "rockchip,ctrl")) {
+               if (!pBC_UOC_FIELDS)
+                       uoc_init_rk(np);
+               return usb_battery_charger_detect_rk(wait);
+       }
+
+       else if (of_device_is_compatible(np, "synopsys,phy")) {
+               if (!pBC_UOC_FIELDS)
+                       uoc_init_synop(np);
+               return usb_battery_charger_detect_synop(wait);
+       }
+
+       else if (of_device_is_compatible(np, "inno,phy")) {
+               if (!pBC_UOC_FIELDS)
+                       uoc_init_inno(np);
+               return usb_battery_charger_detect_inno(wait);
+       }
 fail:
-    return -1;
+       return -1;
 }
-EXPORT_SYMBOL(usb_battery_charger_detect);
 
+EXPORT_SYMBOL(usb_battery_charger_detect);
 
 int dwc_otg_check_dpdm(bool wait)
 {
-    return usb_battery_charger_detect(wait);
+       static struct device_node *np;
+       if (!np)
+               np = of_find_node_by_name(NULL, "usb_bc");
+       if (!np)
+               return -1;
+       if (!pGRF_BASE)
+               pGRF_BASE = get_grf_base(np);
+
+       if (of_device_is_compatible(np, "rockchip,ctrl")) {
+               if (!pBC_UOC_FIELDS)
+                       uoc_init_rk(np);
+               if (!BC_GET(RK_BC_BVALID))
+                       rk_usb_charger_status = USB_BC_TYPE_DISCNT;
+
+       } else if (of_device_is_compatible(np, "synopsys,phy")) {
+               if (!pBC_UOC_FIELDS)
+                       uoc_init_synop(np);
+               if (!BC_GET(SYNOP_BC_BVALID))
+                       rk_usb_charger_status = USB_BC_TYPE_DISCNT;
+
+       } else if (of_device_is_compatible(np, "inno,phy")) {
+               if (!pBC_UOC_FIELDS)
+                       uoc_init_inno(np);
+       }
+
+       return rk_usb_charger_status;
 }
 EXPORT_SYMBOL(dwc_otg_check_dpdm);
 
@@ -231,30 +286,30 @@ EXPORT_SYMBOL(dwc_otg_check_dpdm);
 
 void usb20otg_battery_charger_detect_cb(int charger_type_new)
 {
-    static int charger_type = USB_BC_TYPE_DISCNT;
-    if(charger_type != charger_type_new) {
-        switch(charger_type_new) {
-            case USB_BC_TYPE_DISCNT:
-                break;
+       static int charger_type = USB_BC_TYPE_DISCNT;
+       if (charger_type != charger_type_new) {
+               switch (charger_type_new) {
+               case USB_BC_TYPE_DISCNT:
+                       break;
 
-            case USB_BC_TYPE_SDP:
-                break;
+               case USB_BC_TYPE_SDP:
+                       break;
 
-            case USB_BC_TYPE_DCP:
-                break;
+               case USB_BC_TYPE_DCP:
+                       break;
 
-            case USB_BC_TYPE_CDP:
-                break;
+               case USB_BC_TYPE_CDP:
+                       break;
 
-            case USB_BC_TYPE_UNKNOW:
-                break;
+               case USB_BC_TYPE_UNKNOW:
+                       break;
 
-            default :
-                break;
-        }
+               default:
+                       break;
+               }
 
-        printk("%s , battery_charger_detect %d\n", __func__, charger_type_new);
-    }
-    charger_type = charger_type_new;
+               /* printk("%s , battery_charger_detect %d\n",
+                *        __func__, charger_type_new);*/
+       }
+       charger_type = charger_type_new;
 }
-