Lines Matching refs:isp
74 static inline int isp1704_read(struct isp1704_charger *isp, u32 reg) in isp1704_read() argument
76 return usb_phy_io_read(isp->phy, reg); in isp1704_read()
79 static inline int isp1704_write(struct isp1704_charger *isp, u32 val, u32 reg) in isp1704_write() argument
81 return usb_phy_io_write(isp->phy, val, reg); in isp1704_write()
88 static void isp1704_charger_set_power(struct isp1704_charger *isp, bool on) in isp1704_charger_set_power() argument
90 struct isp1704_charger_data *board = isp->dev->platform_data; in isp1704_charger_set_power()
105 static inline int isp1704_charger_type(struct isp1704_charger *isp) in isp1704_charger_type() argument
112 func_ctrl = isp1704_read(isp, ULPI_FUNC_CTRL); in isp1704_charger_type()
113 otg_ctrl = isp1704_read(isp, ULPI_OTG_CTRL); in isp1704_charger_type()
117 isp1704_write(isp, ULPI_CLR(ULPI_OTG_CTRL), reg); in isp1704_charger_type()
120 isp1704_write(isp, ULPI_CLR(ULPI_FUNC_CTRL), in isp1704_charger_type()
122 isp1704_write(isp, ULPI_SET(ULPI_FUNC_CTRL), in isp1704_charger_type()
127 isp1704_write(isp, ULPI_SET(ULPI_FUNC_CTRL), reg); in isp1704_charger_type()
130 reg = isp1704_read(isp, ULPI_DEBUG); in isp1704_charger_type()
135 isp1704_write(isp, ULPI_FUNC_CTRL, func_ctrl); in isp1704_charger_type()
136 isp1704_write(isp, ULPI_OTG_CTRL, otg_ctrl); in isp1704_charger_type()
145 static inline int isp1704_charger_verify(struct isp1704_charger *isp) in isp1704_charger_verify() argument
151 r = isp1704_read(isp, ULPI_FUNC_CTRL); in isp1704_charger_verify()
153 isp1704_write(isp, ULPI_FUNC_CTRL, r); in isp1704_charger_verify()
158 isp1704_write(isp, ULPI_FUNC_CTRL, r); in isp1704_charger_verify()
162 isp1704_write(isp, ULPI_CLR(ULPI_OTG_CTRL), r); in isp1704_charger_verify()
166 isp1704_write(isp, ULPI_SET(ULPI_FUNC_CTRL), r); in isp1704_charger_verify()
170 if (!isp1704_read(isp, ULPI_DEBUG)) { in isp1704_charger_verify()
172 isp1704_write(isp, ULPI_CLR(ULPI_FUNC_CTRL), in isp1704_charger_verify()
180 isp1704_write(isp, ULPI_SET(ISP1704_PWR_CTRL), in isp1704_charger_verify()
184 isp1704_write(isp, ULPI_CLR(ULPI_FUNC_CTRL), in isp1704_charger_verify()
188 isp1704_write(isp, ULPI_SET(ULPI_OTG_CTRL), in isp1704_charger_verify()
192 if (!(isp1704_read(isp, ULPI_DEBUG))) in isp1704_charger_verify()
196 isp1704_write(isp, ULPI_CLR(ISP1704_PWR_CTRL), in isp1704_charger_verify()
202 static inline int isp1704_charger_detect(struct isp1704_charger *isp) in isp1704_charger_detect() argument
208 pwr_ctrl = isp1704_read(isp, ISP1704_PWR_CTRL); in isp1704_charger_detect()
211 isp1704_write(isp, ISP1704_PWR_CTRL, in isp1704_charger_detect()
215 isp1704_write(isp, ULPI_SET(ISP1704_PWR_CTRL), in isp1704_charger_detect()
223 if (isp1704_read(isp, ISP1704_PWR_CTRL) in isp1704_charger_detect()
225 ret = isp1704_charger_verify(isp); in isp1704_charger_detect()
228 } while (!time_after(jiffies, timeout) && isp->online); in isp1704_charger_detect()
231 isp1704_write(isp, ISP1704_PWR_CTRL, pwr_ctrl); in isp1704_charger_detect()
236 static inline int isp1704_charger_detect_dcp(struct isp1704_charger *isp) in isp1704_charger_detect_dcp() argument
238 if (isp1704_charger_detect(isp) && in isp1704_charger_detect_dcp()
239 isp1704_charger_type(isp) == POWER_SUPPLY_TYPE_USB_DCP) in isp1704_charger_detect_dcp()
247 struct isp1704_charger *isp = in isp1704_charger_work() local
253 switch (isp->phy->last_event) { in isp1704_charger_work()
256 if (!isp->present) { in isp1704_charger_work()
257 isp->online = true; in isp1704_charger_work()
258 isp->present = 1; in isp1704_charger_work()
259 isp1704_charger_set_power(isp, 1); in isp1704_charger_work()
262 if (isp1704_charger_detect_dcp(isp)) { in isp1704_charger_work()
263 isp->psy_desc.type = POWER_SUPPLY_TYPE_USB_DCP; in isp1704_charger_work()
264 isp->current_max = 1800; in isp1704_charger_work()
266 isp->psy_desc.type = POWER_SUPPLY_TYPE_USB; in isp1704_charger_work()
267 isp->current_max = 500; in isp1704_charger_work()
271 if (isp->phy->otg->gadget) in isp1704_charger_work()
272 usb_gadget_connect(isp->phy->otg->gadget); in isp1704_charger_work()
275 if (isp->psy_desc.type != POWER_SUPPLY_TYPE_USB_DCP) { in isp1704_charger_work()
280 if (isp->current_max > 500) in isp1704_charger_work()
281 isp->current_max = 500; in isp1704_charger_work()
283 if (isp->current_max > 100) in isp1704_charger_work()
284 isp->psy_desc.type = POWER_SUPPLY_TYPE_USB_CDP; in isp1704_charger_work()
288 isp->online = false; in isp1704_charger_work()
289 isp->present = 0; in isp1704_charger_work()
290 isp->current_max = 0; in isp1704_charger_work()
291 isp->psy_desc.type = POWER_SUPPLY_TYPE_USB; in isp1704_charger_work()
301 if (isp->phy->otg->gadget) in isp1704_charger_work()
302 usb_gadget_disconnect(isp->phy->otg->gadget); in isp1704_charger_work()
304 isp1704_charger_set_power(isp, 0); in isp1704_charger_work()
310 power_supply_changed(isp->psy); in isp1704_charger_work()
318 struct isp1704_charger *isp = in isp1704_notifier_call() local
321 schedule_work(&isp->work); in isp1704_notifier_call()
330 struct isp1704_charger *isp = power_supply_get_drvdata(psy); in isp1704_charger_get_property() local
334 val->intval = isp->present; in isp1704_charger_get_property()
337 val->intval = isp->online; in isp1704_charger_get_property()
340 val->intval = isp->current_max; in isp1704_charger_get_property()
343 val->strval = isp->model; in isp1704_charger_get_property()
362 static inline int isp1704_test_ulpi(struct isp1704_charger *isp) in isp1704_test_ulpi() argument
370 ret = isp1704_write(isp, ULPI_SCRATCH, 0xaa); in isp1704_test_ulpi()
374 ret = isp1704_read(isp, ULPI_SCRATCH); in isp1704_test_ulpi()
382 vendor = isp1704_read(isp, ULPI_VENDOR_ID_LOW); in isp1704_test_ulpi()
383 vendor |= isp1704_read(isp, ULPI_VENDOR_ID_HIGH) << 8; in isp1704_test_ulpi()
387 product = isp1704_read(isp, ULPI_PRODUCT_ID_LOW); in isp1704_test_ulpi()
388 product |= isp1704_read(isp, ULPI_PRODUCT_ID_HIGH) << 8; in isp1704_test_ulpi()
392 sprintf(isp->model, "isp%x", product); in isp1704_test_ulpi()
397 dev_err(isp->dev, "product id %x not matching known ids", product); in isp1704_test_ulpi()
404 struct isp1704_charger *isp; in isp1704_charger_probe() local
435 isp = devm_kzalloc(&pdev->dev, sizeof(*isp), GFP_KERNEL); in isp1704_charger_probe()
436 if (!isp) in isp1704_charger_probe()
440 isp->phy = devm_usb_get_phy_by_phandle(&pdev->dev, "usb-phy", 0); in isp1704_charger_probe()
442 isp->phy = devm_usb_get_phy(&pdev->dev, USB_PHY_TYPE_USB2); in isp1704_charger_probe()
444 if (IS_ERR(isp->phy)) { in isp1704_charger_probe()
445 ret = PTR_ERR(isp->phy); in isp1704_charger_probe()
449 isp->dev = &pdev->dev; in isp1704_charger_probe()
450 platform_set_drvdata(pdev, isp); in isp1704_charger_probe()
452 isp1704_charger_set_power(isp, 1); in isp1704_charger_probe()
454 ret = isp1704_test_ulpi(isp); in isp1704_charger_probe()
458 isp->psy_desc.name = "isp1704"; in isp1704_charger_probe()
459 isp->psy_desc.type = POWER_SUPPLY_TYPE_USB; in isp1704_charger_probe()
460 isp->psy_desc.properties = power_props; in isp1704_charger_probe()
461 isp->psy_desc.num_properties = ARRAY_SIZE(power_props); in isp1704_charger_probe()
462 isp->psy_desc.get_property = isp1704_charger_get_property; in isp1704_charger_probe()
464 psy_cfg.drv_data = isp; in isp1704_charger_probe()
466 isp->psy = power_supply_register(isp->dev, &isp->psy_desc, &psy_cfg); in isp1704_charger_probe()
467 if (IS_ERR(isp->psy)) { in isp1704_charger_probe()
468 ret = PTR_ERR(isp->psy); in isp1704_charger_probe()
476 INIT_WORK(&isp->work, isp1704_charger_work); in isp1704_charger_probe()
478 isp->nb.notifier_call = isp1704_notifier_call; in isp1704_charger_probe()
480 ret = usb_register_notifier(isp->phy, &isp->nb); in isp1704_charger_probe()
484 dev_info(isp->dev, "registered with product id %s\n", isp->model); in isp1704_charger_probe()
493 if (isp->phy->otg->gadget) in isp1704_charger_probe()
494 usb_gadget_disconnect(isp->phy->otg->gadget); in isp1704_charger_probe()
496 if (isp->phy->last_event == USB_EVENT_NONE) in isp1704_charger_probe()
497 isp1704_charger_set_power(isp, 0); in isp1704_charger_probe()
500 if (isp->phy->last_event == USB_EVENT_VBUS && in isp1704_charger_probe()
501 !isp->phy->otg->default_a) in isp1704_charger_probe()
502 schedule_work(&isp->work); in isp1704_charger_probe()
506 power_supply_unregister(isp->psy); in isp1704_charger_probe()
508 isp1704_charger_set_power(isp, 0); in isp1704_charger_probe()
517 struct isp1704_charger *isp = platform_get_drvdata(pdev); in isp1704_charger_remove() local
519 usb_unregister_notifier(isp->phy, &isp->nb); in isp1704_charger_remove()
520 power_supply_unregister(isp->psy); in isp1704_charger_remove()
521 isp1704_charger_set_power(isp, 0); in isp1704_charger_remove()