Lines Matching refs:ab

239 static void ab8500_usb_wd_workaround(struct ab8500_usb *ab)  in ab8500_usb_wd_workaround()  argument
241 abx500_set_register_interruptible(ab->dev, in ab8500_usb_wd_workaround()
248 abx500_set_register_interruptible(ab->dev, in ab8500_usb_wd_workaround()
256 abx500_set_register_interruptible(ab->dev, in ab8500_usb_wd_workaround()
262 static void ab8500_usb_regulator_enable(struct ab8500_usb *ab) in ab8500_usb_regulator_enable() argument
266 ret = regulator_enable(ab->v_ape); in ab8500_usb_regulator_enable()
268 dev_err(ab->dev, "Failed to enable v-ape\n"); in ab8500_usb_regulator_enable()
270 if (ab->flags & AB8500_USB_FLAG_REGULATOR_SET_VOLTAGE) { in ab8500_usb_regulator_enable()
271 ab->saved_v_ulpi = regulator_get_voltage(ab->v_ulpi); in ab8500_usb_regulator_enable()
272 if (ab->saved_v_ulpi < 0) in ab8500_usb_regulator_enable()
273 dev_err(ab->dev, "Failed to get v_ulpi voltage\n"); in ab8500_usb_regulator_enable()
275 ret = regulator_set_voltage(ab->v_ulpi, 1300000, 1350000); in ab8500_usb_regulator_enable()
277 dev_err(ab->dev, "Failed to set the Vintcore to 1.3V, ret=%d\n", in ab8500_usb_regulator_enable()
280 ret = regulator_set_load(ab->v_ulpi, 28000); in ab8500_usb_regulator_enable()
282 dev_err(ab->dev, "Failed to set optimum mode (ret=%d)\n", in ab8500_usb_regulator_enable()
286 ret = regulator_enable(ab->v_ulpi); in ab8500_usb_regulator_enable()
288 dev_err(ab->dev, "Failed to enable vddulpivio18\n"); in ab8500_usb_regulator_enable()
290 if (ab->flags & AB8500_USB_FLAG_REGULATOR_SET_VOLTAGE) { in ab8500_usb_regulator_enable()
291 volt = regulator_get_voltage(ab->v_ulpi); in ab8500_usb_regulator_enable()
293 dev_err(ab->dev, "Vintcore is not set to 1.3V volt=%d\n", in ab8500_usb_regulator_enable()
297 ret = regulator_enable(ab->v_musb); in ab8500_usb_regulator_enable()
299 dev_err(ab->dev, "Failed to enable musb_1v8\n"); in ab8500_usb_regulator_enable()
302 static void ab8500_usb_regulator_disable(struct ab8500_usb *ab) in ab8500_usb_regulator_disable() argument
306 regulator_disable(ab->v_musb); in ab8500_usb_regulator_disable()
308 regulator_disable(ab->v_ulpi); in ab8500_usb_regulator_disable()
311 if (ab->flags & AB8500_USB_FLAG_REGULATOR_SET_VOLTAGE) { in ab8500_usb_regulator_disable()
312 if (ab->saved_v_ulpi > 0) { in ab8500_usb_regulator_disable()
313 ret = regulator_set_voltage(ab->v_ulpi, in ab8500_usb_regulator_disable()
314 ab->saved_v_ulpi, ab->saved_v_ulpi); in ab8500_usb_regulator_disable()
316 dev_err(ab->dev, "Failed to set the Vintcore to %duV, ret=%d\n", in ab8500_usb_regulator_disable()
317 ab->saved_v_ulpi, ret); in ab8500_usb_regulator_disable()
320 ret = regulator_set_load(ab->v_ulpi, 0); in ab8500_usb_regulator_disable()
322 dev_err(ab->dev, "Failed to set optimum mode (ret=%d)\n", in ab8500_usb_regulator_disable()
326 regulator_disable(ab->v_ape); in ab8500_usb_regulator_disable()
329 static void ab8500_usb_wd_linkstatus(struct ab8500_usb *ab, u8 bit) in ab8500_usb_wd_linkstatus() argument
332 if (is_ab8500_2p0(ab->ab8500)) { in ab8500_usb_wd_linkstatus()
333 abx500_mask_and_set_register_interruptible(ab->dev, in ab8500_usb_wd_linkstatus()
340 static void ab8500_usb_phy_enable(struct ab8500_usb *ab, bool sel_host) in ab8500_usb_phy_enable() argument
347 ab->pinctrl = pinctrl_get_select(ab->dev, PINCTRL_STATE_DEFAULT); in ab8500_usb_phy_enable()
348 if (IS_ERR(ab->pinctrl)) in ab8500_usb_phy_enable()
349 dev_err(ab->dev, "could not get/set default pinstate\n"); in ab8500_usb_phy_enable()
351 if (clk_prepare_enable(ab->sysclk)) in ab8500_usb_phy_enable()
352 dev_err(ab->dev, "can't prepare/enable clock\n"); in ab8500_usb_phy_enable()
354 ab8500_usb_regulator_enable(ab); in ab8500_usb_phy_enable()
356 abx500_mask_and_set_register_interruptible(ab->dev, in ab8500_usb_phy_enable()
360 if (ab->flags & AB8500_USB_FLAG_USE_VBUS_HOST_QUIRK) { in ab8500_usb_phy_enable()
362 abx500_set_register_interruptible(ab->dev, in ab8500_usb_phy_enable()
370 static void ab8500_usb_phy_disable(struct ab8500_usb *ab, bool sel_host) in ab8500_usb_phy_disable() argument
376 ab8500_usb_wd_linkstatus(ab, bit); in ab8500_usb_phy_disable()
378 abx500_mask_and_set_register_interruptible(ab->dev, in ab8500_usb_phy_disable()
383 ab8500_usb_wd_workaround(ab); in ab8500_usb_phy_disable()
385 clk_disable_unprepare(ab->sysclk); in ab8500_usb_phy_disable()
387 ab8500_usb_regulator_disable(ab); in ab8500_usb_phy_disable()
389 if (!IS_ERR(ab->pinctrl)) { in ab8500_usb_phy_disable()
391 ab->pins_sleep = pinctrl_lookup_state(ab->pinctrl, in ab8500_usb_phy_disable()
394 if (IS_ERR(ab->pins_sleep)) in ab8500_usb_phy_disable()
395 dev_dbg(ab->dev, "could not get sleep pinstate\n"); in ab8500_usb_phy_disable()
396 else if (pinctrl_select_state(ab->pinctrl, ab->pins_sleep)) in ab8500_usb_phy_disable()
397 dev_err(ab->dev, "could not set pins to sleep state\n"); in ab8500_usb_phy_disable()
403 pinctrl_put(ab->pinctrl); in ab8500_usb_phy_disable()
407 #define ab8500_usb_host_phy_en(ab) ab8500_usb_phy_enable(ab, true) argument
408 #define ab8500_usb_host_phy_dis(ab) ab8500_usb_phy_disable(ab, true) argument
409 #define ab8500_usb_peri_phy_en(ab) ab8500_usb_phy_enable(ab, false) argument
410 #define ab8500_usb_peri_phy_dis(ab) ab8500_usb_phy_disable(ab, false) argument
412 static int ab9540_usb_link_status_update(struct ab8500_usb *ab, in ab9540_usb_link_status_update() argument
417 dev_dbg(ab->dev, "ab9540_usb_link_status_update %d\n", lsts); in ab9540_usb_link_status_update()
419 if (ab->previous_link_status_state == USB_LINK_HM_IDGND_9540 && in ab9540_usb_link_status_update()
424 if (ab->previous_link_status_state == USB_LINK_ACA_RID_A_9540 && in ab9540_usb_link_status_update()
428 ab->previous_link_status_state = lsts; in ab9540_usb_link_status_update()
438 if (ab->mode == USB_PERIPHERAL) in ab9540_usb_link_status_update()
439 atomic_notifier_call_chain(&ab->phy.notifier, in ab9540_usb_link_status_update()
440 UX500_MUSB_CLEAN, &ab->vbus_draw); in ab9540_usb_link_status_update()
441 ab->mode = USB_IDLE; in ab9540_usb_link_status_update()
442 ab->phy.otg->default_a = false; in ab9540_usb_link_status_update()
443 ab->vbus_draw = 0; in ab9540_usb_link_status_update()
447 ab->phy.otg->state = OTG_STATE_B_IDLE; in ab9540_usb_link_status_update()
448 usb_phy_set_event(&ab->phy, USB_EVENT_NONE); in ab9540_usb_link_status_update()
457 if (ab->mode == USB_HOST) { in ab9540_usb_link_status_update()
458 ab->mode = USB_PERIPHERAL; in ab9540_usb_link_status_update()
459 ab8500_usb_host_phy_dis(ab); in ab9540_usb_link_status_update()
460 ab8500_usb_peri_phy_en(ab); in ab9540_usb_link_status_update()
461 atomic_notifier_call_chain(&ab->phy.notifier, in ab9540_usb_link_status_update()
462 UX500_MUSB_PREPARE, &ab->vbus_draw); in ab9540_usb_link_status_update()
463 usb_phy_set_event(&ab->phy, USB_EVENT_ENUMERATED); in ab9540_usb_link_status_update()
465 if (ab->mode == USB_IDLE) { in ab9540_usb_link_status_update()
466 ab->mode = USB_PERIPHERAL; in ab9540_usb_link_status_update()
467 ab8500_usb_peri_phy_en(ab); in ab9540_usb_link_status_update()
468 atomic_notifier_call_chain(&ab->phy.notifier, in ab9540_usb_link_status_update()
469 UX500_MUSB_PREPARE, &ab->vbus_draw); in ab9540_usb_link_status_update()
470 usb_phy_set_event(&ab->phy, USB_EVENT_ENUMERATED); in ab9540_usb_link_status_update()
480 if (ab->mode == USB_PERIPHERAL) { in ab9540_usb_link_status_update()
481 ab->mode = USB_HOST; in ab9540_usb_link_status_update()
482 ab8500_usb_peri_phy_dis(ab); in ab9540_usb_link_status_update()
483 ab8500_usb_host_phy_en(ab); in ab9540_usb_link_status_update()
484 atomic_notifier_call_chain(&ab->phy.notifier, in ab9540_usb_link_status_update()
485 UX500_MUSB_PREPARE, &ab->vbus_draw); in ab9540_usb_link_status_update()
487 if (ab->mode == USB_IDLE) { in ab9540_usb_link_status_update()
488 ab->mode = USB_HOST; in ab9540_usb_link_status_update()
489 ab8500_usb_host_phy_en(ab); in ab9540_usb_link_status_update()
490 atomic_notifier_call_chain(&ab->phy.notifier, in ab9540_usb_link_status_update()
491 UX500_MUSB_PREPARE, &ab->vbus_draw); in ab9540_usb_link_status_update()
493 ab->phy.otg->default_a = true; in ab9540_usb_link_status_update()
497 atomic_notifier_call_chain(&ab->phy.notifier, in ab9540_usb_link_status_update()
498 event, &ab->vbus_draw); in ab9540_usb_link_status_update()
502 ab->mode = USB_DEDICATED_CHG; in ab9540_usb_link_status_update()
504 atomic_notifier_call_chain(&ab->phy.notifier, in ab9540_usb_link_status_update()
505 event, &ab->vbus_draw); in ab9540_usb_link_status_update()
506 usb_phy_set_event(&ab->phy, USB_EVENT_CHARGER); in ab9540_usb_link_status_update()
511 if (!(is_ab9540_2p0_or_earlier(ab->ab8500))) { in ab9540_usb_link_status_update()
513 if (ab->mode == USB_HOST) { in ab9540_usb_link_status_update()
514 ab->phy.otg->default_a = false; in ab9540_usb_link_status_update()
515 ab->vbus_draw = 0; in ab9540_usb_link_status_update()
516 atomic_notifier_call_chain(&ab->phy.notifier, in ab9540_usb_link_status_update()
517 event, &ab->vbus_draw); in ab9540_usb_link_status_update()
518 ab8500_usb_host_phy_dis(ab); in ab9540_usb_link_status_update()
519 ab->mode = USB_IDLE; in ab9540_usb_link_status_update()
521 if (ab->mode == USB_PERIPHERAL) { in ab9540_usb_link_status_update()
522 atomic_notifier_call_chain(&ab->phy.notifier, in ab9540_usb_link_status_update()
523 event, &ab->vbus_draw); in ab9540_usb_link_status_update()
524 ab8500_usb_peri_phy_dis(ab); in ab9540_usb_link_status_update()
525 atomic_notifier_call_chain(&ab->phy.notifier, in ab9540_usb_link_status_update()
527 &ab->vbus_draw); in ab9540_usb_link_status_update()
528 ab->mode = USB_IDLE; in ab9540_usb_link_status_update()
529 ab->phy.otg->default_a = false; in ab9540_usb_link_status_update()
530 ab->vbus_draw = 0; in ab9540_usb_link_status_update()
531 usb_phy_set_event(&ab->phy, USB_EVENT_NONE); in ab9540_usb_link_status_update()
543 static int ab8540_usb_link_status_update(struct ab8500_usb *ab, in ab8540_usb_link_status_update() argument
548 dev_dbg(ab->dev, "ab8540_usb_link_status_update %d\n", lsts); in ab8540_usb_link_status_update()
550 if (ab->enabled_charging_detection) { in ab8540_usb_link_status_update()
552 abx500_mask_and_set_register_interruptible(ab->dev, in ab8540_usb_link_status_update()
555 ab->enabled_charging_detection = false; in ab8540_usb_link_status_update()
562 if (ab->previous_link_status_state == USB_LINK_HM_IDGND_8540 && in ab8540_usb_link_status_update()
567 if (ab->previous_link_status_state == USB_LINK_ACA_RID_A_8540 && in ab8540_usb_link_status_update()
571 ab->previous_link_status_state = lsts; in ab8540_usb_link_status_update()
581 ab->mode = USB_IDLE; in ab8540_usb_link_status_update()
582 ab->phy.otg->default_a = false; in ab8540_usb_link_status_update()
583 ab->vbus_draw = 0; in ab8540_usb_link_status_update()
590 ab->phy.otg->state = OTG_STATE_B_IDLE; in ab8540_usb_link_status_update()
591 usb_phy_set_event(&ab->phy, USB_EVENT_NONE); in ab8540_usb_link_status_update()
600 if (ab->mode == USB_IDLE) { in ab8540_usb_link_status_update()
601 ab->mode = USB_PERIPHERAL; in ab8540_usb_link_status_update()
602 ab8500_usb_peri_phy_en(ab); in ab8540_usb_link_status_update()
603 atomic_notifier_call_chain(&ab->phy.notifier, in ab8540_usb_link_status_update()
604 UX500_MUSB_PREPARE, &ab->vbus_draw); in ab8540_usb_link_status_update()
605 usb_phy_set_event(&ab->phy, USB_EVENT_ENUMERATED); in ab8540_usb_link_status_update()
616 if (ab->mode == USB_IDLE) { in ab8540_usb_link_status_update()
617 ab->mode = USB_HOST; in ab8540_usb_link_status_update()
618 ab8500_usb_host_phy_en(ab); in ab8540_usb_link_status_update()
619 atomic_notifier_call_chain(&ab->phy.notifier, in ab8540_usb_link_status_update()
620 UX500_MUSB_PREPARE, &ab->vbus_draw); in ab8540_usb_link_status_update()
622 ab->phy.otg->default_a = true; in ab8540_usb_link_status_update()
625 atomic_notifier_call_chain(&ab->phy.notifier, in ab8540_usb_link_status_update()
626 event, &ab->vbus_draw); in ab8540_usb_link_status_update()
630 ab->mode = USB_DEDICATED_CHG; in ab8540_usb_link_status_update()
632 atomic_notifier_call_chain(&ab->phy.notifier, in ab8540_usb_link_status_update()
633 event, &ab->vbus_draw); in ab8540_usb_link_status_update()
634 usb_phy_set_event(&ab->phy, USB_EVENT_CHARGER); in ab8540_usb_link_status_update()
640 if (ab->mode == USB_HOST) { in ab8540_usb_link_status_update()
641 ab->phy.otg->default_a = false; in ab8540_usb_link_status_update()
642 ab->vbus_draw = 0; in ab8540_usb_link_status_update()
643 atomic_notifier_call_chain(&ab->phy.notifier, in ab8540_usb_link_status_update()
644 event, &ab->vbus_draw); in ab8540_usb_link_status_update()
645 ab8500_usb_host_phy_dis(ab); in ab8540_usb_link_status_update()
646 ab->mode = USB_IDLE; in ab8540_usb_link_status_update()
648 if (ab->mode == USB_PERIPHERAL) { in ab8540_usb_link_status_update()
649 atomic_notifier_call_chain(&ab->phy.notifier, in ab8540_usb_link_status_update()
650 event, &ab->vbus_draw); in ab8540_usb_link_status_update()
651 ab8500_usb_peri_phy_dis(ab); in ab8540_usb_link_status_update()
652 atomic_notifier_call_chain(&ab->phy.notifier, in ab8540_usb_link_status_update()
653 UX500_MUSB_CLEAN, &ab->vbus_draw); in ab8540_usb_link_status_update()
654 ab->mode = USB_IDLE; in ab8540_usb_link_status_update()
655 ab->phy.otg->default_a = false; in ab8540_usb_link_status_update()
656 ab->vbus_draw = 0; in ab8540_usb_link_status_update()
657 usb_phy_set_event(&ab->phy, USB_EVENT_NONE); in ab8540_usb_link_status_update()
669 static int ab8505_usb_link_status_update(struct ab8500_usb *ab, in ab8505_usb_link_status_update() argument
674 dev_dbg(ab->dev, "ab8505_usb_link_status_update %d\n", lsts); in ab8505_usb_link_status_update()
680 if (ab->previous_link_status_state == USB_LINK_ACA_RID_A_8505 && in ab8505_usb_link_status_update()
684 ab->previous_link_status_state = lsts; in ab8505_usb_link_status_update()
694 ab->mode = USB_IDLE; in ab8505_usb_link_status_update()
695 ab->phy.otg->default_a = false; in ab8505_usb_link_status_update()
696 ab->vbus_draw = 0; in ab8505_usb_link_status_update()
703 ab->phy.otg->state = OTG_STATE_B_IDLE; in ab8505_usb_link_status_update()
704 usb_phy_set_event(&ab->phy, USB_EVENT_NONE); in ab8505_usb_link_status_update()
713 if (ab->mode == USB_IDLE) { in ab8505_usb_link_status_update()
714 ab->mode = USB_PERIPHERAL; in ab8505_usb_link_status_update()
715 ab8500_usb_peri_phy_en(ab); in ab8505_usb_link_status_update()
716 atomic_notifier_call_chain(&ab->phy.notifier, in ab8505_usb_link_status_update()
717 UX500_MUSB_PREPARE, &ab->vbus_draw); in ab8505_usb_link_status_update()
718 usb_phy_set_event(&ab->phy, USB_EVENT_ENUMERATED); in ab8505_usb_link_status_update()
728 if (ab->mode == USB_IDLE) { in ab8505_usb_link_status_update()
729 ab->mode = USB_HOST; in ab8505_usb_link_status_update()
730 ab8500_usb_host_phy_en(ab); in ab8505_usb_link_status_update()
731 atomic_notifier_call_chain(&ab->phy.notifier, in ab8505_usb_link_status_update()
732 UX500_MUSB_PREPARE, &ab->vbus_draw); in ab8505_usb_link_status_update()
734 ab->phy.otg->default_a = true; in ab8505_usb_link_status_update()
737 atomic_notifier_call_chain(&ab->phy.notifier, in ab8505_usb_link_status_update()
738 event, &ab->vbus_draw); in ab8505_usb_link_status_update()
742 ab->mode = USB_DEDICATED_CHG; in ab8505_usb_link_status_update()
744 atomic_notifier_call_chain(&ab->phy.notifier, in ab8505_usb_link_status_update()
745 event, &ab->vbus_draw); in ab8505_usb_link_status_update()
746 usb_phy_set_event(&ab->phy, USB_EVENT_CHARGER); in ab8505_usb_link_status_update()
756 static int ab8500_usb_link_status_update(struct ab8500_usb *ab, in ab8500_usb_link_status_update() argument
761 dev_dbg(ab->dev, "ab8500_usb_link_status_update %d\n", lsts); in ab8500_usb_link_status_update()
767 if (ab->previous_link_status_state == USB_LINK_HM_IDGND_8500 && in ab8500_usb_link_status_update()
772 if (ab->previous_link_status_state == USB_LINK_ACA_RID_A_8500 && in ab8500_usb_link_status_update()
776 ab->previous_link_status_state = lsts; in ab8500_usb_link_status_update()
783 ab->mode = USB_IDLE; in ab8500_usb_link_status_update()
784 ab->phy.otg->default_a = false; in ab8500_usb_link_status_update()
785 ab->vbus_draw = 0; in ab8500_usb_link_status_update()
789 ab->phy.otg->state = OTG_STATE_B_IDLE; in ab8500_usb_link_status_update()
790 usb_phy_set_event(&ab->phy, USB_EVENT_NONE); in ab8500_usb_link_status_update()
803 if (ab->mode == USB_IDLE) { in ab8500_usb_link_status_update()
804 ab->mode = USB_PERIPHERAL; in ab8500_usb_link_status_update()
805 ab8500_usb_peri_phy_en(ab); in ab8500_usb_link_status_update()
806 atomic_notifier_call_chain(&ab->phy.notifier, in ab8500_usb_link_status_update()
807 UX500_MUSB_PREPARE, &ab->vbus_draw); in ab8500_usb_link_status_update()
808 usb_phy_set_event(&ab->phy, USB_EVENT_ENUMERATED); in ab8500_usb_link_status_update()
817 if (ab->mode == USB_IDLE) { in ab8500_usb_link_status_update()
818 ab->mode = USB_HOST; in ab8500_usb_link_status_update()
819 ab8500_usb_host_phy_en(ab); in ab8500_usb_link_status_update()
820 atomic_notifier_call_chain(&ab->phy.notifier, in ab8500_usb_link_status_update()
821 UX500_MUSB_PREPARE, &ab->vbus_draw); in ab8500_usb_link_status_update()
823 ab->phy.otg->default_a = true; in ab8500_usb_link_status_update()
826 atomic_notifier_call_chain(&ab->phy.notifier, in ab8500_usb_link_status_update()
827 event, &ab->vbus_draw); in ab8500_usb_link_status_update()
831 ab->mode = USB_DEDICATED_CHG; in ab8500_usb_link_status_update()
833 atomic_notifier_call_chain(&ab->phy.notifier, in ab8500_usb_link_status_update()
834 event, &ab->vbus_draw); in ab8500_usb_link_status_update()
835 usb_phy_set_event(&ab->phy, USB_EVENT_CHARGER); in ab8500_usb_link_status_update()
856 static int abx500_usb_link_status_update(struct ab8500_usb *ab) in abx500_usb_link_status_update() argument
861 if (is_ab8500(ab->ab8500)) { in abx500_usb_link_status_update()
864 abx500_get_register_interruptible(ab->dev, in abx500_usb_link_status_update()
867 ret = ab8500_usb_link_status_update(ab, lsts); in abx500_usb_link_status_update()
868 } else if (is_ab8505(ab->ab8500)) { in abx500_usb_link_status_update()
871 abx500_get_register_interruptible(ab->dev, in abx500_usb_link_status_update()
874 ret = ab8505_usb_link_status_update(ab, lsts); in abx500_usb_link_status_update()
875 } else if (is_ab8540(ab->ab8500)) { in abx500_usb_link_status_update()
878 abx500_get_register_interruptible(ab->dev, in abx500_usb_link_status_update()
881 ret = ab8540_usb_link_status_update(ab, lsts); in abx500_usb_link_status_update()
882 } else if (is_ab9540(ab->ab8500)) { in abx500_usb_link_status_update()
885 abx500_get_register_interruptible(ab->dev, in abx500_usb_link_status_update()
888 ret = ab9540_usb_link_status_update(ab, lsts); in abx500_usb_link_status_update()
905 struct ab8500_usb *ab = (struct ab8500_usb *) data; in ab8500_usb_disconnect_irq() local
909 if (ab->mode == USB_HOST) { in ab8500_usb_disconnect_irq()
910 ab->phy.otg->default_a = false; in ab8500_usb_disconnect_irq()
911 ab->vbus_draw = 0; in ab8500_usb_disconnect_irq()
912 atomic_notifier_call_chain(&ab->phy.notifier, in ab8500_usb_disconnect_irq()
913 event, &ab->vbus_draw); in ab8500_usb_disconnect_irq()
914 ab8500_usb_host_phy_dis(ab); in ab8500_usb_disconnect_irq()
915 ab->mode = USB_IDLE; in ab8500_usb_disconnect_irq()
918 if (ab->mode == USB_PERIPHERAL) { in ab8500_usb_disconnect_irq()
919 atomic_notifier_call_chain(&ab->phy.notifier, in ab8500_usb_disconnect_irq()
920 event, &ab->vbus_draw); in ab8500_usb_disconnect_irq()
921 ab8500_usb_peri_phy_dis(ab); in ab8500_usb_disconnect_irq()
922 atomic_notifier_call_chain(&ab->phy.notifier, in ab8500_usb_disconnect_irq()
923 UX500_MUSB_CLEAN, &ab->vbus_draw); in ab8500_usb_disconnect_irq()
924 ab->mode = USB_IDLE; in ab8500_usb_disconnect_irq()
925 ab->phy.otg->default_a = false; in ab8500_usb_disconnect_irq()
926 ab->vbus_draw = 0; in ab8500_usb_disconnect_irq()
929 if (is_ab8500_2p0(ab->ab8500)) { in ab8500_usb_disconnect_irq()
930 if (ab->mode == USB_DEDICATED_CHG) { in ab8500_usb_disconnect_irq()
931 ab8500_usb_wd_linkstatus(ab, in ab8500_usb_disconnect_irq()
933 abx500_mask_and_set_register_interruptible(ab->dev, in ab8500_usb_disconnect_irq()
944 struct ab8500_usb *ab = (struct ab8500_usb *)data; in ab8500_usb_link_status_irq() local
946 abx500_usb_link_status_update(ab); in ab8500_usb_link_status_irq()
953 struct ab8500_usb *ab = container_of(work, struct ab8500_usb, in ab8500_usb_phy_disable_work() local
956 if (!ab->phy.otg->host) in ab8500_usb_phy_disable_work()
957 ab8500_usb_host_phy_dis(ab); in ab8500_usb_phy_disable_work()
959 if (!ab->phy.otg->gadget) in ab8500_usb_phy_disable_work()
960 ab8500_usb_peri_phy_dis(ab); in ab8500_usb_phy_disable_work()
964 static bool ab8500_usb_check_vbus_status(struct ab8500_usb *ab) in ab8500_usb_check_vbus_status() argument
970 abx500_get_register_interruptible(ab->dev, in ab8500_usb_check_vbus_status()
978 abx500_get_register_interruptible(ab->dev, in ab8500_usb_check_vbus_status()
994 struct ab8500_usb *ab = container_of(work, struct ab8500_usb, in ab8500_usb_vbus_turn_on_event_work() local
997 if (ab->mode != USB_IDLE) in ab8500_usb_vbus_turn_on_event_work()
1000 abx500_set_register_interruptible(ab->dev, in ab8500_usb_vbus_turn_on_event_work()
1006 abx500_set_register_interruptible(ab->dev, in ab8500_usb_vbus_turn_on_event_work()
1013 abx500_set_register_interruptible(ab->dev, in ab8500_usb_vbus_turn_on_event_work()
1018 abx500_mask_and_set_register_interruptible(ab->dev, in ab8500_usb_vbus_turn_on_event_work()
1023 ab->enabled_charging_detection = true; in ab8500_usb_vbus_turn_on_event_work()
1026 static unsigned ab8500_eyediagram_workaroud(struct ab8500_usb *ab, unsigned mA) in ab8500_eyediagram_workaroud() argument
1032 if (is_ab8500_2p0_or_earlier(ab->ab8500)) in ab8500_eyediagram_workaroud()
1041 struct ab8500_usb *ab; in ab8500_usb_set_power() local
1046 ab = phy_to_ab(phy); in ab8500_usb_set_power()
1048 mA = ab8500_eyediagram_workaroud(ab, mA); in ab8500_usb_set_power()
1050 ab->vbus_draw = mA; in ab8500_usb_set_power()
1052 atomic_notifier_call_chain(&ab->phy.notifier, in ab8500_usb_set_power()
1053 UX500_MUSB_VBUS, &ab->vbus_draw); in ab8500_usb_set_power()
1067 struct ab8500_usb *ab; in ab8500_usb_set_peripheral() local
1072 ab = phy_to_ab(otg->usb_phy); in ab8500_usb_set_peripheral()
1074 ab->phy.otg->gadget = gadget; in ab8500_usb_set_peripheral()
1081 if ((ab->mode != USB_IDLE) && !gadget) { in ab8500_usb_set_peripheral()
1082 ab->mode = USB_IDLE; in ab8500_usb_set_peripheral()
1083 schedule_work(&ab->phy_dis_work); in ab8500_usb_set_peripheral()
1091 struct ab8500_usb *ab; in ab8500_usb_set_host() local
1096 ab = phy_to_ab(otg->usb_phy); in ab8500_usb_set_host()
1098 ab->phy.otg->host = host; in ab8500_usb_set_host()
1105 if ((ab->mode != USB_IDLE) && !host) { in ab8500_usb_set_host()
1106 ab->mode = USB_IDLE; in ab8500_usb_set_host()
1107 schedule_work(&ab->phy_dis_work); in ab8500_usb_set_host()
1113 static void ab8500_usb_restart_phy(struct ab8500_usb *ab) in ab8500_usb_restart_phy() argument
1115 abx500_mask_and_set_register_interruptible(ab->dev, in ab8500_usb_restart_phy()
1122 abx500_mask_and_set_register_interruptible(ab->dev, in ab8500_usb_restart_phy()
1127 abx500_mask_and_set_register_interruptible(ab->dev, in ab8500_usb_restart_phy()
1134 abx500_mask_and_set_register_interruptible(ab->dev, in ab8500_usb_restart_phy()
1140 static int ab8500_usb_regulator_get(struct ab8500_usb *ab) in ab8500_usb_regulator_get() argument
1144 ab->v_ape = devm_regulator_get(ab->dev, "v-ape"); in ab8500_usb_regulator_get()
1145 if (IS_ERR(ab->v_ape)) { in ab8500_usb_regulator_get()
1146 dev_err(ab->dev, "Could not get v-ape supply\n"); in ab8500_usb_regulator_get()
1147 err = PTR_ERR(ab->v_ape); in ab8500_usb_regulator_get()
1151 ab->v_ulpi = devm_regulator_get(ab->dev, "vddulpivio18"); in ab8500_usb_regulator_get()
1152 if (IS_ERR(ab->v_ulpi)) { in ab8500_usb_regulator_get()
1153 dev_err(ab->dev, "Could not get vddulpivio18 supply\n"); in ab8500_usb_regulator_get()
1154 err = PTR_ERR(ab->v_ulpi); in ab8500_usb_regulator_get()
1158 ab->v_musb = devm_regulator_get(ab->dev, "musb_1v8"); in ab8500_usb_regulator_get()
1159 if (IS_ERR(ab->v_musb)) { in ab8500_usb_regulator_get()
1160 dev_err(ab->dev, "Could not get musb_1v8 supply\n"); in ab8500_usb_regulator_get()
1161 err = PTR_ERR(ab->v_musb); in ab8500_usb_regulator_get()
1169 struct ab8500_usb *ab) in ab8500_usb_irq_setup() argument
1174 if (ab->flags & AB8500_USB_FLAG_USE_LINK_STATUS_IRQ) { in ab8500_usb_irq_setup()
1183 "usb-link-status", ab); in ab8500_usb_irq_setup()
1185 dev_err(ab->dev, "request_irq failed for link status irq\n"); in ab8500_usb_irq_setup()
1190 if (ab->flags & AB8500_USB_FLAG_USE_ID_WAKEUP_IRQ) { in ab8500_usb_irq_setup()
1199 "usb-id-fall", ab); in ab8500_usb_irq_setup()
1201 dev_err(ab->dev, "request_irq failed for ID fall irq\n"); in ab8500_usb_irq_setup()
1206 if (ab->flags & AB8500_USB_FLAG_USE_VBUS_DET_IRQ) { in ab8500_usb_irq_setup()
1215 "usb-vbus-fall", ab); in ab8500_usb_irq_setup()
1217 dev_err(ab->dev, "request_irq failed for Vbus fall irq\n"); in ab8500_usb_irq_setup()
1225 static void ab8500_usb_set_ab8500_tuning_values(struct ab8500_usb *ab) in ab8500_usb_set_ab8500_tuning_values() argument
1230 err = abx500_set_register_interruptible(ab->dev, in ab8500_usb_set_ab8500_tuning_values()
1233 dev_err(ab->dev, "Failed to enable bank12 access err=%d\n", in ab8500_usb_set_ab8500_tuning_values()
1236 err = abx500_set_register_interruptible(ab->dev, in ab8500_usb_set_ab8500_tuning_values()
1239 dev_err(ab->dev, "Failed to set PHY_TUNE1 register err=%d\n", in ab8500_usb_set_ab8500_tuning_values()
1242 err = abx500_set_register_interruptible(ab->dev, in ab8500_usb_set_ab8500_tuning_values()
1245 dev_err(ab->dev, "Failed to set PHY_TUNE2 register err=%d\n", in ab8500_usb_set_ab8500_tuning_values()
1248 err = abx500_set_register_interruptible(ab->dev, in ab8500_usb_set_ab8500_tuning_values()
1251 dev_err(ab->dev, "Failed to set PHY_TUNE3 regester err=%d\n", in ab8500_usb_set_ab8500_tuning_values()
1255 err = abx500_set_register_interruptible(ab->dev, in ab8500_usb_set_ab8500_tuning_values()
1258 dev_err(ab->dev, "Failed to switch bank12 access err=%d\n", in ab8500_usb_set_ab8500_tuning_values()
1262 static void ab8500_usb_set_ab8505_tuning_values(struct ab8500_usb *ab) in ab8500_usb_set_ab8505_tuning_values() argument
1267 err = abx500_mask_and_set_register_interruptible(ab->dev, in ab8500_usb_set_ab8505_tuning_values()
1271 dev_err(ab->dev, "Failed to enable bank12 access err=%d\n", in ab8500_usb_set_ab8505_tuning_values()
1274 err = abx500_mask_and_set_register_interruptible(ab->dev, in ab8500_usb_set_ab8505_tuning_values()
1278 dev_err(ab->dev, "Failed to set PHY_TUNE1 register err=%d\n", in ab8500_usb_set_ab8505_tuning_values()
1281 err = abx500_mask_and_set_register_interruptible(ab->dev, in ab8500_usb_set_ab8505_tuning_values()
1285 dev_err(ab->dev, "Failed to set PHY_TUNE2 register err=%d\n", in ab8500_usb_set_ab8505_tuning_values()
1288 err = abx500_mask_and_set_register_interruptible(ab->dev, in ab8500_usb_set_ab8505_tuning_values()
1293 dev_err(ab->dev, "Failed to set PHY_TUNE3 regester err=%d\n", in ab8500_usb_set_ab8505_tuning_values()
1297 err = abx500_mask_and_set_register_interruptible(ab->dev, in ab8500_usb_set_ab8505_tuning_values()
1301 dev_err(ab->dev, "Failed to switch bank12 access err=%d\n", in ab8500_usb_set_ab8505_tuning_values()
1305 static void ab8500_usb_set_ab8540_tuning_values(struct ab8500_usb *ab) in ab8500_usb_set_ab8540_tuning_values() argument
1309 err = abx500_set_register_interruptible(ab->dev, in ab8500_usb_set_ab8540_tuning_values()
1312 dev_err(ab->dev, "Failed to set PHY_TUNE1 register ret=%d\n", in ab8500_usb_set_ab8540_tuning_values()
1315 err = abx500_set_register_interruptible(ab->dev, in ab8500_usb_set_ab8540_tuning_values()
1318 dev_err(ab->dev, "Failed to set PHY_TUNE2 register ret=%d\n", in ab8500_usb_set_ab8540_tuning_values()
1321 err = abx500_set_register_interruptible(ab->dev, in ab8500_usb_set_ab8540_tuning_values()
1324 dev_err(ab->dev, "Failed to set PHY_TUNE3 regester ret=%d\n", in ab8500_usb_set_ab8540_tuning_values()
1328 static void ab8500_usb_set_ab9540_tuning_values(struct ab8500_usb *ab) in ab8500_usb_set_ab9540_tuning_values() argument
1333 err = abx500_set_register_interruptible(ab->dev, in ab8500_usb_set_ab9540_tuning_values()
1336 dev_err(ab->dev, "Failed to enable bank12 access err=%d\n", in ab8500_usb_set_ab9540_tuning_values()
1339 err = abx500_set_register_interruptible(ab->dev, in ab8500_usb_set_ab9540_tuning_values()
1342 dev_err(ab->dev, "Failed to set PHY_TUNE1 register err=%d\n", in ab8500_usb_set_ab9540_tuning_values()
1345 err = abx500_set_register_interruptible(ab->dev, in ab8500_usb_set_ab9540_tuning_values()
1348 dev_err(ab->dev, "Failed to set PHY_TUNE2 register err=%d\n", in ab8500_usb_set_ab9540_tuning_values()
1351 err = abx500_set_register_interruptible(ab->dev, in ab8500_usb_set_ab9540_tuning_values()
1354 dev_err(ab->dev, "Failed to set PHY_TUNE3 regester err=%d\n", in ab8500_usb_set_ab9540_tuning_values()
1358 err = abx500_set_register_interruptible(ab->dev, in ab8500_usb_set_ab9540_tuning_values()
1361 dev_err(ab->dev, "Failed to switch bank12 access err=%d\n", in ab8500_usb_set_ab9540_tuning_values()
1367 struct ab8500_usb *ab; in ab8500_usb_probe() local
1381 ab = devm_kzalloc(&pdev->dev, sizeof(*ab), GFP_KERNEL); in ab8500_usb_probe()
1382 if (!ab) in ab8500_usb_probe()
1389 ab->dev = &pdev->dev; in ab8500_usb_probe()
1390 ab->ab8500 = ab8500; in ab8500_usb_probe()
1391 ab->phy.dev = ab->dev; in ab8500_usb_probe()
1392 ab->phy.otg = otg; in ab8500_usb_probe()
1393 ab->phy.label = "ab8500"; in ab8500_usb_probe()
1394 ab->phy.set_suspend = ab8500_usb_set_suspend; in ab8500_usb_probe()
1395 ab->phy.set_power = ab8500_usb_set_power; in ab8500_usb_probe()
1396 ab->phy.otg->state = OTG_STATE_UNDEFINED; in ab8500_usb_probe()
1398 otg->usb_phy = &ab->phy; in ab8500_usb_probe()
1402 if (is_ab8500(ab->ab8500)) { in ab8500_usb_probe()
1403 ab->flags |= AB8500_USB_FLAG_USE_LINK_STATUS_IRQ | in ab8500_usb_probe()
1407 } else if (is_ab8505(ab->ab8500)) { in ab8500_usb_probe()
1408 ab->flags |= AB8500_USB_FLAG_USE_LINK_STATUS_IRQ | in ab8500_usb_probe()
1412 } else if (is_ab8540(ab->ab8500)) { in ab8500_usb_probe()
1413 ab->flags |= AB8500_USB_FLAG_USE_LINK_STATUS_IRQ | in ab8500_usb_probe()
1417 } else if (is_ab9540(ab->ab8500)) { in ab8500_usb_probe()
1418 ab->flags |= AB8500_USB_FLAG_USE_LINK_STATUS_IRQ | in ab8500_usb_probe()
1420 if (is_ab9540_2p0_or_earlier(ab->ab8500)) in ab8500_usb_probe()
1421 ab->flags |= AB8500_USB_FLAG_USE_ID_WAKEUP_IRQ | in ab8500_usb_probe()
1426 if (is_ab8500_2p0_or_earlier(ab->ab8500)) in ab8500_usb_probe()
1427 ab->flags &= ~AB8500_USB_FLAG_REGULATOR_SET_VOLTAGE; in ab8500_usb_probe()
1429 platform_set_drvdata(pdev, ab); in ab8500_usb_probe()
1432 INIT_WORK(&ab->phy_dis_work, ab8500_usb_phy_disable_work); in ab8500_usb_probe()
1434 INIT_WORK(&ab->vbus_event_work, ab8500_usb_vbus_turn_on_event_work); in ab8500_usb_probe()
1436 err = ab8500_usb_regulator_get(ab); in ab8500_usb_probe()
1440 ab->sysclk = devm_clk_get(ab->dev, "sysclk"); in ab8500_usb_probe()
1441 if (IS_ERR(ab->sysclk)) { in ab8500_usb_probe()
1442 dev_err(ab->dev, "Could not get sysclk.\n"); in ab8500_usb_probe()
1443 return PTR_ERR(ab->sysclk); in ab8500_usb_probe()
1446 err = ab8500_usb_irq_setup(pdev, ab); in ab8500_usb_probe()
1450 err = usb_add_phy(&ab->phy, USB_PHY_TYPE_USB2); in ab8500_usb_probe()
1456 if (is_ab8500(ab->ab8500) && !is_ab8500_2p0_or_earlier(ab->ab8500)) in ab8500_usb_probe()
1458 ab8500_usb_set_ab8500_tuning_values(ab); in ab8500_usb_probe()
1459 else if (is_ab8505(ab->ab8500)) in ab8500_usb_probe()
1461 ab8500_usb_set_ab8505_tuning_values(ab); in ab8500_usb_probe()
1462 else if (is_ab8540(ab->ab8500)) in ab8500_usb_probe()
1464 ab8500_usb_set_ab8540_tuning_values(ab); in ab8500_usb_probe()
1465 else if (is_ab9540(ab->ab8500)) in ab8500_usb_probe()
1467 ab8500_usb_set_ab9540_tuning_values(ab); in ab8500_usb_probe()
1470 ab8500_usb_wd_workaround(ab); in ab8500_usb_probe()
1476 ab8500_usb_restart_phy(ab); in ab8500_usb_probe()
1478 if (ab->flags & AB8500_USB_FLAG_USE_CHECK_VBUS_STATUS) { in ab8500_usb_probe()
1479 if (ab8500_usb_check_vbus_status(ab)) in ab8500_usb_probe()
1480 schedule_work(&ab->vbus_event_work); in ab8500_usb_probe()
1483 abx500_usb_link_status_update(ab); in ab8500_usb_probe()
1492 struct ab8500_usb *ab = platform_get_drvdata(pdev); in ab8500_usb_remove() local
1494 cancel_work_sync(&ab->phy_dis_work); in ab8500_usb_remove()
1495 cancel_work_sync(&ab->vbus_event_work); in ab8500_usb_remove()
1497 usb_remove_phy(&ab->phy); in ab8500_usb_remove()
1499 if (ab->mode == USB_HOST) in ab8500_usb_remove()
1500 ab8500_usb_host_phy_dis(ab); in ab8500_usb_remove()
1501 else if (ab->mode == USB_PERIPHERAL) in ab8500_usb_remove()
1502 ab8500_usb_peri_phy_dis(ab); in ab8500_usb_remove()