int sprd_charger_is_adapter(struct sprd_battery_data *data) { uint32_t ret; volatile uint32_t i; unsigned long irq_flag = 0; gpio_request(USB_DM_GPIO, "sprd_charge"); gpio_request(USB_DP_GPIO, "sprd_charge"); gpio_direction_input(USB_DM_GPIO); gpio_direction_input(USB_DP_GPIO); udc_enable(); udc_phy_down(); local_irq_save(irq_flag); sprd_greg_clear_bits(REG_TYPE_AHB_GLOBAL, (USB_DM_PULLDOWN_BIT | USB_DP_PULLDOWN_BIT), USB_PHY_CTRL); /* Identify USB charger */ sprd_greg_set_bits(REG_TYPE_AHB_GLOBAL, USB_DM_PULLUP_BIT, USB_PHY_CTRL); mdelay(10); ret = gpio_get_value(USB_DM_GPIO); sprd_greg_clear_bits(REG_TYPE_AHB_GLOBAL, (USB_DM_PULLUP_BIT), USB_PHY_CTRL); /* normal charger */ if (ret) { /* Identify standard adapter */ sprd_greg_set_bits(REG_TYPE_AHB_GLOBAL, USB_DM_PULLDOWN_BIT, USB_PHY_CTRL); for (i = 0; i < 200; i++) {; } if ((gpio_get_value(USB_DM_GPIO) & BIT(1)) && (gpio_get_value(USB_DP_GPIO) & BIT(2))) { ret = 1; /* adapter */ } else { ret = 1; /* non standard adapter */ } sprd_greg_clear_bits(REG_TYPE_AHB_GLOBAL, (USB_DM_PULLDOWN_BIT), USB_PHY_CTRL); } local_irq_restore(irq_flag); udc_disable(); gpio_free(USB_DM_GPIO); gpio_free(USB_DP_GPIO); return ret; }
int sprd_charger_is_adapter(struct sprd_battery_data *data) { uint32_t ret; volatile uint32_t i; unsigned long irq_flag = 0; mdelay(300); gpio_request(USB_DM_GPIO, "sprd_charge"); gpio_request(USB_DP_GPIO, "sprd_charge"); gpio_direction_input(USB_DM_GPIO); gpio_direction_input(USB_DP_GPIO); udc_enable(); udc_phy_down(); local_irq_save(irq_flag); sci_glb_clr(REG_AHB_USB_PHY_CTRL, (BIT_DMPULLDOWN | BIT_DPPULLDOWN)); /* Identify USB charger */ sci_glb_set(REG_AHB_USB_PHY_CTRL, BIT_DMPULLUP); mdelay(10); ret = gpio_get_value(USB_DM_GPIO); sci_glb_clr(REG_AHB_USB_PHY_CTRL, (BIT_DMPULLUP)); #if 0 /* normal charger */ if (ret) { /* Identify standard adapter */ sci_glb_set(REG_AHB_USB_PHY_CTRL, BIT_DMPULLDOWN); for (i = 0; i < 1000; i++) {; } if (gpio_get_value(USB_DM_GPIO) == gpio_get_value(USB_DP_GPIO)) { ret = 1; /* adapter */ } else { ret = 1; /* non standard adapter */ } sci_glb_clr(REG_AHB_USB_PHY_CTRL, (BIT_DMPULLDOWN)); } #endif local_irq_restore(irq_flag); udc_disable(); gpio_free(USB_DM_GPIO); gpio_free(USB_DP_GPIO); return ret; }