Lines Matching +full:hsic +full:- +full:0

1 // SPDX-License-Identifier: GPL-2.0+
17 #define MX25_USB_PHY_CTRL_OFFSET 0x08
20 #define MX25_EHCI_INTERFACE_SINGLE_UNI (2 << 0)
21 #define MX25_EHCI_INTERFACE_DIFF_UNI (0 << 0)
22 #define MX25_EHCI_INTERFACE_MASK (0xf)
25 #define MX25_OTG_SIC_MASK (0x3 << MX25_OTG_SIC_SHIFT)
31 #define MX25_H1_SIC_MASK (0x3 << MX25_H1_SIC_SHIFT)
44 #define MX53_USB_OTG_PHY_CTRL_0_OFFSET 0x08
45 #define MX53_USB_OTG_PHY_CTRL_1_OFFSET 0x0c
46 #define MX53_USB_CTRL_1_OFFSET 0x10
47 #define MX53_USB_CTRL_1_H2_XCVR_CLK_SEL_MASK (0x11 << 2)
49 #define MX53_USB_CTRL_1_H3_XCVR_CLK_SEL_MASK (0x11 << 6)
51 #define MX53_USB_UH2_CTRL_OFFSET 0x14
52 #define MX53_USB_UH3_CTRL_OFFSET 0x18
53 #define MX53_USB_CLKONOFF_CTRL_OFFSET 0x24
63 #define MX53_USB_PHYCTRL1_PLLDIV_MASK 0x3
64 #define MX53_USB_PLL_DIV_24_MHZ 0x01
77 #define MX6_USB_HSIC_CTRL_OFFSET 0x10
82 /* HSIC enable */
84 /* Force HSIC module 480M clock on, even when in Host is in suspend mode */
87 #define MX6_USB_OTG1_PHY_CTRL 0x18
88 /* For imx6dql, it is host-only controller, for later imx6, it is otg's */
89 #define MX6_USB_OTG2_PHY_CTRL 0x1c
91 #define MX6SX_USB_VBUS_WAKEUP_SOURCE_VBUS MX6SX_USB_VBUS_WAKEUP_SOURCE(0)
98 #define MX7D_USBNC_USB_CTRL2 0x4
99 #define MX7D_USB_VBUS_WAKEUP_SOURCE_MASK 0x3
100 #define MX7D_USB_VBUS_WAKEUP_SOURCE(v) (v << 0)
101 #define MX7D_USB_VBUS_WAKEUP_SOURCE_VBUS MX7D_USB_VBUS_WAKEUP_SOURCE(0)
106 /* The default DM/DP value is pull-down */
118 #define MX7D_USB_OTG_PHY_CFG2_CHRG_CHRGSEL BIT(0)
124 #define MX7D_USB_OTG_PHY_CFG2 0x34
126 #define MX7D_USB_OTG_PHY_STATUS 0x3c
127 #define MX7D_USB_OTG_PHY_STATUS_LINE_STATE0 BIT(0)
132 #define MX7D_USB_OTG_PHY_CFG1 0x30
138 #define TXVREFTUNE0_MASK (0xf << 20)
147 #define BLKCTL_USB_WAKEUP_CTRL 0x0
152 #define BLKCTL_OTG_DPDM_WAKEUP_EN BIT(0)
159 #define S32G_WAKEUP_IE BIT(0)
203 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx25_init()
205 u32 val = 0; in usbmisc_imx25_init()
207 if (data->index > 1) in usbmisc_imx25_init()
208 return -EINVAL; in usbmisc_imx25_init()
210 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx25_init()
211 switch (data->index) { in usbmisc_imx25_init()
212 case 0: in usbmisc_imx25_init()
213 val = readl(usbmisc->base); in usbmisc_imx25_init()
222 if (data->oc_pol_configured && data->oc_pol_active_low) in usbmisc_imx25_init()
225 writel(val, usbmisc->base); in usbmisc_imx25_init()
228 val = readl(usbmisc->base); in usbmisc_imx25_init()
238 if (data->oc_pol_configured && data->oc_pol_active_low) in usbmisc_imx25_init()
241 writel(val, usbmisc->base); in usbmisc_imx25_init()
245 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx25_init()
247 return 0; in usbmisc_imx25_init()
252 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx25_post()
257 if (data->index > 2) in usbmisc_imx25_post()
258 return -EINVAL; in usbmisc_imx25_post()
260 if (data->index) in usbmisc_imx25_post()
261 return 0; in usbmisc_imx25_post()
263 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx25_post()
264 reg = usbmisc->base + MX25_USB_PHY_CTRL_OFFSET; in usbmisc_imx25_post()
267 if (data->evdo) in usbmisc_imx25_post()
273 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx25_post()
276 return 0; in usbmisc_imx25_post()
281 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx27_init()
285 switch (data->index) { in usbmisc_imx27_init()
286 case 0: in usbmisc_imx27_init()
296 return -EINVAL; in usbmisc_imx27_init()
299 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx27_init()
300 if (data->disable_oc) in usbmisc_imx27_init()
301 val = readl(usbmisc->base) | val; in usbmisc_imx27_init()
303 val = readl(usbmisc->base) & ~val; in usbmisc_imx27_init()
304 writel(val, usbmisc->base); in usbmisc_imx27_init()
305 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx27_init()
307 return 0; in usbmisc_imx27_init()
312 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx53_init()
315 u32 val = 0; in usbmisc_imx53_init()
317 if (data->index > 3) in usbmisc_imx53_init()
318 return -EINVAL; in usbmisc_imx53_init()
321 val = readl(usbmisc->base + MX53_USB_OTG_PHY_CTRL_1_OFFSET); in usbmisc_imx53_init()
324 writel(val, usbmisc->base + MX53_USB_OTG_PHY_CTRL_1_OFFSET); in usbmisc_imx53_init()
326 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx53_init()
328 switch (data->index) { in usbmisc_imx53_init()
329 case 0: in usbmisc_imx53_init()
330 if (data->disable_oc) { in usbmisc_imx53_init()
331 reg = usbmisc->base + MX53_USB_OTG_PHY_CTRL_0_OFFSET; in usbmisc_imx53_init()
337 if (data->disable_oc) { in usbmisc_imx53_init()
338 reg = usbmisc->base + MX53_USB_OTG_PHY_CTRL_0_OFFSET; in usbmisc_imx53_init()
344 if (data->ulpi) { in usbmisc_imx53_init()
345 /* set USBH2 into ULPI-mode. */ in usbmisc_imx53_init()
346 reg = usbmisc->base + MX53_USB_CTRL_1_OFFSET; in usbmisc_imx53_init()
353 reg = usbmisc->base + MX53_USB_UH2_CTRL_OFFSET; in usbmisc_imx53_init()
359 reg = usbmisc->base + in usbmisc_imx53_init()
367 if (data->disable_oc) { in usbmisc_imx53_init()
368 reg = usbmisc->base + MX53_USB_UH2_CTRL_OFFSET; in usbmisc_imx53_init()
374 if (data->ulpi) { in usbmisc_imx53_init()
375 /* set USBH3 into ULPI-mode. */ in usbmisc_imx53_init()
376 reg = usbmisc->base + MX53_USB_CTRL_1_OFFSET; in usbmisc_imx53_init()
383 reg = usbmisc->base + MX53_USB_UH3_CTRL_OFFSET; in usbmisc_imx53_init()
390 reg = usbmisc->base + in usbmisc_imx53_init()
397 if (data->disable_oc) { in usbmisc_imx53_init()
398 reg = usbmisc->base + MX53_USB_UH3_CTRL_OFFSET; in usbmisc_imx53_init()
405 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx53_init()
407 return 0; in usbmisc_imx53_init()
414 if (data->ext_id || data->available_role != USB_DR_MODE_OTG) in usbmisc_wakeup_setting()
417 if (data->ext_vbus || data->available_role == USB_DR_MODE_HOST) in usbmisc_wakeup_setting()
426 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx6q_set_wakeup()
429 int ret = 0; in usbmisc_imx6q_set_wakeup()
431 if (data->index > 3) in usbmisc_imx6q_set_wakeup()
432 return -EINVAL; in usbmisc_imx6q_set_wakeup()
434 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx6q_set_wakeup()
435 val = readl(usbmisc->base + data->index * 4); in usbmisc_imx6q_set_wakeup()
441 pr_debug("wakeup int at ci_hdrc.%d\n", data->index); in usbmisc_imx6q_set_wakeup()
444 writel(val, usbmisc->base + data->index * 4); in usbmisc_imx6q_set_wakeup()
445 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx6q_set_wakeup()
452 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx6q_init()
456 if (data->index > 3) in usbmisc_imx6q_init()
457 return -EINVAL; in usbmisc_imx6q_init()
459 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx6q_init()
461 reg = readl(usbmisc->base + data->index * 4); in usbmisc_imx6q_init()
462 if (data->disable_oc) { in usbmisc_imx6q_init()
471 if (data->oc_pol_configured && data->oc_pol_active_low) in usbmisc_imx6q_init()
473 else if (data->oc_pol_configured) in usbmisc_imx6q_init()
477 if (data->pwr_pol == 1) in usbmisc_imx6q_init()
479 writel(reg, usbmisc->base + data->index * 4); in usbmisc_imx6q_init()
481 /* SoC non-burst setting */ in usbmisc_imx6q_init()
482 reg = readl(usbmisc->base + data->index * 4); in usbmisc_imx6q_init()
484 usbmisc->base + data->index * 4); in usbmisc_imx6q_init()
486 /* For HSIC controller */ in usbmisc_imx6q_init()
487 if (data->hsic) { in usbmisc_imx6q_init()
488 reg = readl(usbmisc->base + data->index * 4); in usbmisc_imx6q_init()
490 usbmisc->base + data->index * 4); in usbmisc_imx6q_init()
491 reg = readl(usbmisc->base + MX6_USB_HSIC_CTRL_OFFSET in usbmisc_imx6q_init()
492 + (data->index - 2) * 4); in usbmisc_imx6q_init()
494 writel(reg, usbmisc->base + MX6_USB_HSIC_CTRL_OFFSET in usbmisc_imx6q_init()
495 + (data->index - 2) * 4); in usbmisc_imx6q_init()
498 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx6q_init()
502 return 0; in usbmisc_imx6q_init()
507 int offset, ret = 0; in usbmisc_imx6_hsic_get_reg_offset()
509 if (data->index == 2 || data->index == 3) { in usbmisc_imx6_hsic_get_reg_offset()
510 offset = (data->index - 2) * 4; in usbmisc_imx6_hsic_get_reg_offset()
511 } else if (data->index == 0) { in usbmisc_imx6_hsic_get_reg_offset()
514 * its own non-core register region. For SoCs before i.MX7D, in usbmisc_imx6_hsic_get_reg_offset()
515 * the first two USB controllers are non-HSIC controllers. in usbmisc_imx6_hsic_get_reg_offset()
517 offset = 0; in usbmisc_imx6_hsic_get_reg_offset()
519 dev_err(data->dev, "index is error for usbmisc\n"); in usbmisc_imx6_hsic_get_reg_offset()
520 ret = -EINVAL; in usbmisc_imx6_hsic_get_reg_offset()
530 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx6_hsic_set_connect()
533 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx6_hsic_set_connect()
535 if (offset < 0) { in usbmisc_imx6_hsic_set_connect()
536 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx6_hsic_set_connect()
540 val = readl(usbmisc->base + MX6_USB_HSIC_CTRL_OFFSET + offset); in usbmisc_imx6_hsic_set_connect()
543 usbmisc->base + MX6_USB_HSIC_CTRL_OFFSET + offset); in usbmisc_imx6_hsic_set_connect()
545 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx6_hsic_set_connect()
547 return 0; in usbmisc_imx6_hsic_set_connect()
554 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx6_hsic_set_clk()
557 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx6_hsic_set_clk()
559 if (offset < 0) { in usbmisc_imx6_hsic_set_clk()
560 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx6_hsic_set_clk()
564 val = readl(usbmisc->base + MX6_USB_HSIC_CTRL_OFFSET + offset); in usbmisc_imx6_hsic_set_clk()
571 writel(val, usbmisc->base + MX6_USB_HSIC_CTRL_OFFSET + offset); in usbmisc_imx6_hsic_set_clk()
572 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx6_hsic_set_clk()
574 return 0; in usbmisc_imx6_hsic_set_clk()
582 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx6sx_init()
587 if (data->index == 0 || data->index == 1) { in usbmisc_imx6sx_init()
588 reg = usbmisc->base + MX6_USB_OTG1_PHY_CTRL + data->index * 4; in usbmisc_imx6sx_init()
589 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx6sx_init()
597 val = readl(usbmisc->base + data->index * 4); in usbmisc_imx6sx_init()
599 usbmisc->base + data->index * 4); in usbmisc_imx6sx_init()
600 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx6sx_init()
603 /* For HSIC controller */ in usbmisc_imx6sx_init()
604 if (data->hsic) { in usbmisc_imx6sx_init()
605 val = readl(usbmisc->base + MX6_USB_HSIC_CTRL_OFFSET); in usbmisc_imx6sx_init()
607 writel(val, usbmisc->base + MX6_USB_HSIC_CTRL_OFFSET); in usbmisc_imx6sx_init()
610 return 0; in usbmisc_imx6sx_init()
615 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_vf610_init()
622 if (data->index >= 1) in usbmisc_vf610_init()
623 return -EINVAL; in usbmisc_vf610_init()
625 if (data->disable_oc) { in usbmisc_vf610_init()
626 reg = readl(usbmisc->base); in usbmisc_vf610_init()
627 writel(reg | VF610_OVER_CUR_DIS, usbmisc->base); in usbmisc_vf610_init()
630 return 0; in usbmisc_vf610_init()
635 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_s32g_set_wakeup()
639 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_s32g_set_wakeup()
641 reg = readl(usbmisc->base); in usbmisc_s32g_set_wakeup()
647 writel(reg, usbmisc->base); in usbmisc_s32g_set_wakeup()
648 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_s32g_set_wakeup()
650 return 0; in usbmisc_s32g_set_wakeup()
655 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_s32g_init()
659 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_s32g_init()
661 reg = readl(usbmisc->base); in usbmisc_s32g_init()
666 writel(reg, usbmisc->base); in usbmisc_s32g_init()
668 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_s32g_init()
671 return 0; in usbmisc_s32g_init()
681 return usbmisc_s32g_init(data, 0); in usbmisc_s32g3_init()
687 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx7d_set_wakeup()
691 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx7d_set_wakeup()
692 val = readl(usbmisc->base); in usbmisc_imx7d_set_wakeup()
696 writel(val, usbmisc->base); in usbmisc_imx7d_set_wakeup()
699 dev_dbg(data->dev, "wakeup int\n"); in usbmisc_imx7d_set_wakeup()
700 writel(val & ~MX6_USB_OTG_WAKEUP_BITS, usbmisc->base); in usbmisc_imx7d_set_wakeup()
702 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx7d_set_wakeup()
704 return 0; in usbmisc_imx7d_set_wakeup()
709 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx7d_init()
713 if (data->index >= 1) in usbmisc_imx7d_init()
714 return -EINVAL; in usbmisc_imx7d_init()
716 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx7d_init()
717 reg = readl(usbmisc->base); in usbmisc_imx7d_init()
718 if (data->disable_oc) { in usbmisc_imx7d_init()
727 if (data->oc_pol_configured && data->oc_pol_active_low) in usbmisc_imx7d_init()
729 else if (data->oc_pol_configured) in usbmisc_imx7d_init()
733 if (data->pwr_pol == 1) in usbmisc_imx7d_init()
735 writel(reg, usbmisc->base); in usbmisc_imx7d_init()
737 /* SoC non-burst setting */ in usbmisc_imx7d_init()
738 reg = readl(usbmisc->base); in usbmisc_imx7d_init()
739 writel(reg | MX6_BM_NON_BURST_SETTING, usbmisc->base); in usbmisc_imx7d_init()
741 if (!data->hsic) { in usbmisc_imx7d_init()
742 reg = readl(usbmisc->base + MX7D_USBNC_USB_CTRL2); in usbmisc_imx7d_init()
746 usbmisc->base + MX7D_USBNC_USB_CTRL2); in usbmisc_imx7d_init()
748 reg = readl(usbmisc->base + MX7D_USB_OTG_PHY_CFG1); in usbmisc_imx7d_init()
749 if (data->emp_curr_control >= 0 && in usbmisc_imx7d_init()
750 data->emp_curr_control <= in usbmisc_imx7d_init()
753 reg |= (data->emp_curr_control << TXPREEMPAMPTUNE0_BIT); in usbmisc_imx7d_init()
756 if (data->dc_vol_level_adjust >= 0 && in usbmisc_imx7d_init()
757 data->dc_vol_level_adjust <= in usbmisc_imx7d_init()
760 reg |= (data->dc_vol_level_adjust << TXVREFTUNE0_BIT); in usbmisc_imx7d_init()
763 if (data->rise_fall_time_adjust >= 0 && in usbmisc_imx7d_init()
764 data->rise_fall_time_adjust <= in usbmisc_imx7d_init()
767 reg |= (data->rise_fall_time_adjust << TXRISETUNE0_BIT); in usbmisc_imx7d_init()
770 writel(reg, usbmisc->base + MX7D_USB_OTG_PHY_CFG1); in usbmisc_imx7d_init()
773 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx7d_init()
777 return 0; in usbmisc_imx7d_init()
782 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in imx7d_charger_secondary_detection()
783 struct usb_phy *usb_phy = data->usb_phy; in imx7d_charger_secondary_detection()
788 spin_lock_irqsave(&usbmisc->lock, flags); in imx7d_charger_secondary_detection()
789 val = readl(usbmisc->base + MX7D_USB_OTG_PHY_CFG2); in imx7d_charger_secondary_detection()
791 writel(val, usbmisc->base + MX7D_USB_OTG_PHY_CFG2); in imx7d_charger_secondary_detection()
792 spin_unlock_irqrestore(&usbmisc->lock, flags); in imx7d_charger_secondary_detection()
797 /* VDM_SRC is connected to D- and IDP_SINK is connected to D+ */ in imx7d_charger_secondary_detection()
798 spin_lock_irqsave(&usbmisc->lock, flags); in imx7d_charger_secondary_detection()
799 val = readl(usbmisc->base + MX7D_USB_OTG_PHY_CFG2); in imx7d_charger_secondary_detection()
803 usbmisc->base + MX7D_USB_OTG_PHY_CFG2); in imx7d_charger_secondary_detection()
804 spin_unlock_irqrestore(&usbmisc->lock, flags); in imx7d_charger_secondary_detection()
814 val = readl(usbmisc->base + MX7D_USB_OTG_PHY_STATUS); in imx7d_charger_secondary_detection()
816 dev_dbg(data->dev, "It is a dedicate charging port\n"); in imx7d_charger_secondary_detection()
817 usb_phy->chg_type = DCP_TYPE; in imx7d_charger_secondary_detection()
819 dev_dbg(data->dev, "It is a charging downstream port\n"); in imx7d_charger_secondary_detection()
820 usb_phy->chg_type = CDP_TYPE; in imx7d_charger_secondary_detection()
823 return 0; in imx7d_charger_secondary_detection()
828 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in imx7_disable_charger_detector()
832 spin_lock_irqsave(&usbmisc->lock, flags); in imx7_disable_charger_detector()
833 val = readl(usbmisc->base + MX7D_USB_OTG_PHY_CFG2); in imx7_disable_charger_detector()
838 writel(val, usbmisc->base + MX7D_USB_OTG_PHY_CFG2); in imx7_disable_charger_detector()
841 val = readl(usbmisc->base + MX7D_USBNC_USB_CTRL2); in imx7_disable_charger_detector()
843 writel(val, usbmisc->base + MX7D_USBNC_USB_CTRL2); in imx7_disable_charger_detector()
845 val = readl(usbmisc->base + MX7D_USBNC_USB_CTRL2); in imx7_disable_charger_detector()
847 usbmisc->base + MX7D_USBNC_USB_CTRL2); in imx7_disable_charger_detector()
848 spin_unlock_irqrestore(&usbmisc->lock, flags); in imx7_disable_charger_detector()
853 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in imx7d_charger_data_contact_detect()
856 int i, data_pin_contact_count = 0; in imx7d_charger_data_contact_detect()
859 spin_lock_irqsave(&usbmisc->lock, flags); in imx7d_charger_data_contact_detect()
860 val = readl(usbmisc->base + MX7D_USB_OTG_PHY_CFG2); in imx7d_charger_data_contact_detect()
862 usbmisc->base + MX7D_USB_OTG_PHY_CFG2); in imx7d_charger_data_contact_detect()
863 spin_unlock_irqrestore(&usbmisc->lock, flags); in imx7d_charger_data_contact_detect()
865 for (i = 0; i < 100; i = i + 1) { in imx7d_charger_data_contact_detect()
866 val = readl(usbmisc->base + MX7D_USB_OTG_PHY_STATUS); in imx7d_charger_data_contact_detect()
873 data_pin_contact_count = 0; in imx7d_charger_data_contact_detect()
879 spin_lock_irqsave(&usbmisc->lock, flags); in imx7d_charger_data_contact_detect()
880 val = readl(usbmisc->base + MX7D_USB_OTG_PHY_CFG2); in imx7d_charger_data_contact_detect()
882 usbmisc->base + MX7D_USB_OTG_PHY_CFG2); in imx7d_charger_data_contact_detect()
883 spin_unlock_irqrestore(&usbmisc->lock, flags); in imx7d_charger_data_contact_detect()
886 dev_err(data->dev, in imx7d_charger_data_contact_detect()
888 return -ENXIO; in imx7d_charger_data_contact_detect()
891 return 0; in imx7d_charger_data_contact_detect()
896 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in imx7d_charger_primary_detection()
897 struct usb_phy *usb_phy = data->usb_phy; in imx7d_charger_primary_detection()
901 /* VDP_SRC is connected to D+ and IDM_SINK is connected to D- */ in imx7d_charger_primary_detection()
902 spin_lock_irqsave(&usbmisc->lock, flags); in imx7d_charger_primary_detection()
903 val = readl(usbmisc->base + MX7D_USB_OTG_PHY_CFG2); in imx7d_charger_primary_detection()
907 usbmisc->base + MX7D_USB_OTG_PHY_CFG2); in imx7d_charger_primary_detection()
908 spin_unlock_irqrestore(&usbmisc->lock, flags); in imx7d_charger_primary_detection()
913 /* Check if D- is less than VDAT_REF to determine an SDP per BC 1.2 */ in imx7d_charger_primary_detection()
914 val = readl(usbmisc->base + MX7D_USB_OTG_PHY_STATUS); in imx7d_charger_primary_detection()
916 dev_dbg(data->dev, "It is a standard downstream port\n"); in imx7d_charger_primary_detection()
917 usb_phy->chg_type = SDP_TYPE; in imx7d_charger_primary_detection()
920 return 0; in imx7d_charger_primary_detection()
925 * 1. OPMODE override to be non-driving
933 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in imx7d_charger_detection()
934 struct usb_phy *usb_phy = data->usb_phy; in imx7d_charger_detection()
940 val = readl(usbmisc->base + MX7D_USB_OTG_PHY_STATUS); in imx7d_charger_detection()
942 dev_err(data->dev, "vbus is error\n"); in imx7d_charger_detection()
943 return -EINVAL; in imx7d_charger_detection()
947 * Keep OPMODE to be non-driving mode during the whole in imx7d_charger_detection()
950 spin_lock_irqsave(&usbmisc->lock, flags); in imx7d_charger_detection()
951 val = readl(usbmisc->base + MX7D_USBNC_USB_CTRL2); in imx7d_charger_detection()
954 writel(val, usbmisc->base + MX7D_USBNC_USB_CTRL2); in imx7d_charger_detection()
956 val = readl(usbmisc->base + MX7D_USBNC_USB_CTRL2); in imx7d_charger_detection()
958 usbmisc->base + MX7D_USBNC_USB_CTRL2); in imx7d_charger_detection()
959 spin_unlock_irqrestore(&usbmisc->lock, flags); in imx7d_charger_detection()
966 if (!ret && usb_phy->chg_type != SDP_TYPE) in imx7d_charger_detection()
978 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx7d_vbus_comparator_on()
981 if (data->hsic) in usbmisc_imx7d_vbus_comparator_on()
984 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx7d_vbus_comparator_on()
991 val = readl(usbmisc->base + MX7D_USB_OTG_PHY_CFG2); in usbmisc_imx7d_vbus_comparator_on()
997 writel(val, usbmisc->base + MX7D_USB_OTG_PHY_CFG2); in usbmisc_imx7d_vbus_comparator_on()
998 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx7d_vbus_comparator_on()
1003 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx7ulp_init()
1007 if (data->index >= 1) in usbmisc_imx7ulp_init()
1008 return -EINVAL; in usbmisc_imx7ulp_init()
1010 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx7ulp_init()
1011 reg = readl(usbmisc->base); in usbmisc_imx7ulp_init()
1012 if (data->disable_oc) { in usbmisc_imx7ulp_init()
1021 if (data->oc_pol_configured && data->oc_pol_active_low) in usbmisc_imx7ulp_init()
1023 else if (data->oc_pol_configured) in usbmisc_imx7ulp_init()
1027 if (data->pwr_pol == 1) in usbmisc_imx7ulp_init()
1030 writel(reg, usbmisc->base); in usbmisc_imx7ulp_init()
1032 /* SoC non-burst setting */ in usbmisc_imx7ulp_init()
1033 reg = readl(usbmisc->base); in usbmisc_imx7ulp_init()
1034 writel(reg | MX6_BM_NON_BURST_SETTING, usbmisc->base); in usbmisc_imx7ulp_init()
1036 if (data->hsic) { in usbmisc_imx7ulp_init()
1037 reg = readl(usbmisc->base); in usbmisc_imx7ulp_init()
1038 writel(reg | MX6_BM_UTMI_ON_CLOCK, usbmisc->base); in usbmisc_imx7ulp_init()
1040 reg = readl(usbmisc->base + MX6_USB_HSIC_CTRL_OFFSET); in usbmisc_imx7ulp_init()
1042 writel(reg, usbmisc->base + MX6_USB_HSIC_CTRL_OFFSET); in usbmisc_imx7ulp_init()
1045 * For non-HSIC controller, the autoresume is enabled in usbmisc_imx7ulp_init()
1048 reg = readl(usbmisc->base + MX7D_USBNC_USB_CTRL2); in usbmisc_imx7ulp_init()
1050 usbmisc->base + MX7D_USBNC_USB_CTRL2); in usbmisc_imx7ulp_init()
1052 reg = readl(usbmisc->base + MX7D_USBNC_USB_CTRL2); in usbmisc_imx7ulp_init()
1055 usbmisc->base + MX7D_USBNC_USB_CTRL2); in usbmisc_imx7ulp_init()
1058 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx7ulp_init()
1062 return 0; in usbmisc_imx7ulp_init()
1067 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx7d_pullup()
1074 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx7d_pullup()
1075 val = readl(usbmisc->base + MX7D_USBNC_USB_CTRL2); in usbmisc_imx7d_pullup()
1079 writel(val, usbmisc->base + MX7D_USBNC_USB_CTRL2); in usbmisc_imx7d_pullup()
1080 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx7d_pullup()
1082 /* Last for at least 1 micro-frame to let host see disconnect signal */ in usbmisc_imx7d_pullup()
1085 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx7d_pullup()
1087 val |= MX7D_USBNC_USB_CTRL2_OPMODE(0); in usbmisc_imx7d_pullup()
1089 writel(val, usbmisc->base + MX7D_USBNC_USB_CTRL2); in usbmisc_imx7d_pullup()
1090 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx7d_pullup()
1095 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx7d_power_lost_check()
1099 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx7d_power_lost_check()
1100 val = readl(usbmisc->base); in usbmisc_imx7d_power_lost_check()
1101 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx7d_power_lost_check()
1106 if (val == 0x30001000) in usbmisc_imx7d_power_lost_check()
1109 return 0; in usbmisc_imx7d_power_lost_check()
1114 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx6sx_power_lost_check()
1118 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx6sx_power_lost_check()
1119 val = readl(usbmisc->base + data->index * 4); in usbmisc_imx6sx_power_lost_check()
1120 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx6sx_power_lost_check()
1125 if (val == 0x30001000) in usbmisc_imx6sx_power_lost_check()
1128 return 0; in usbmisc_imx6sx_power_lost_check()
1140 if (data->ext_id || data->available_role != USB_DR_MODE_OTG) in usbmisc_blkctl_wakeup_setting()
1143 if (data->ext_vbus || data->available_role == USB_DR_MODE_HOST) in usbmisc_blkctl_wakeup_setting()
1154 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in usbmisc_imx95_set_wakeup()
1158 if (!usbmisc->blkctl) in usbmisc_imx95_set_wakeup()
1159 return 0; in usbmisc_imx95_set_wakeup()
1161 spin_lock_irqsave(&usbmisc->lock, flags); in usbmisc_imx95_set_wakeup()
1162 val = readl(usbmisc->blkctl + BLKCTL_USB_WAKEUP_CTRL); in usbmisc_imx95_set_wakeup()
1168 writel(val, usbmisc->blkctl + BLKCTL_USB_WAKEUP_CTRL); in usbmisc_imx95_set_wakeup()
1169 spin_unlock_irqrestore(&usbmisc->lock, flags); in usbmisc_imx95_set_wakeup()
1171 return 0; in usbmisc_imx95_set_wakeup()
1250 struct imx_usbmisc *usbmisc = dev_get_drvdata(data->dev); in is_imx53_usbmisc()
1252 return usbmisc->ops == &imx53_usbmisc_ops; in is_imx53_usbmisc()
1260 return 0; in imx_usbmisc_init()
1262 usbmisc = dev_get_drvdata(data->dev); in imx_usbmisc_init()
1263 if (!usbmisc->ops->init) in imx_usbmisc_init()
1264 return 0; in imx_usbmisc_init()
1265 return usbmisc->ops->init(data); in imx_usbmisc_init()
1272 int ret = 0; in imx_usbmisc_init_post()
1275 return 0; in imx_usbmisc_init_post()
1277 usbmisc = dev_get_drvdata(data->dev); in imx_usbmisc_init_post()
1278 if (usbmisc->ops->post) in imx_usbmisc_init_post()
1279 ret = usbmisc->ops->post(data); in imx_usbmisc_init_post()
1281 dev_err(data->dev, "post init failed, ret=%d\n", ret); in imx_usbmisc_init_post()
1285 if (usbmisc->ops->set_wakeup) in imx_usbmisc_init_post()
1286 ret = usbmisc->ops->set_wakeup(data, false); in imx_usbmisc_init_post()
1288 dev_err(data->dev, "set_wakeup failed, ret=%d\n", ret); in imx_usbmisc_init_post()
1292 return 0; in imx_usbmisc_init_post()
1301 return 0; in imx_usbmisc_hsic_set_connect()
1303 usbmisc = dev_get_drvdata(data->dev); in imx_usbmisc_hsic_set_connect()
1304 if (!usbmisc->ops->hsic_set_connect || !data->hsic) in imx_usbmisc_hsic_set_connect()
1305 return 0; in imx_usbmisc_hsic_set_connect()
1306 return usbmisc->ops->hsic_set_connect(data); in imx_usbmisc_hsic_set_connect()
1314 int ret = 0; in imx_usbmisc_charger_detection()
1317 return -EINVAL; in imx_usbmisc_charger_detection()
1319 usbmisc = dev_get_drvdata(data->dev); in imx_usbmisc_charger_detection()
1320 usb_phy = data->usb_phy; in imx_usbmisc_charger_detection()
1321 if (!usbmisc->ops->charger_detection) in imx_usbmisc_charger_detection()
1322 return -ENOTSUPP; in imx_usbmisc_charger_detection()
1325 ret = usbmisc->ops->charger_detection(data); in imx_usbmisc_charger_detection()
1327 dev_err(data->dev, in imx_usbmisc_charger_detection()
1330 usb_phy->chg_state = USB_CHARGER_ABSENT; in imx_usbmisc_charger_detection()
1332 usb_phy->chg_state = USB_CHARGER_PRESENT; in imx_usbmisc_charger_detection()
1335 usb_phy->chg_state = USB_CHARGER_ABSENT; in imx_usbmisc_charger_detection()
1336 usb_phy->chg_type = UNKNOWN_TYPE; in imx_usbmisc_charger_detection()
1347 return 0; in imx_usbmisc_pullup()
1349 usbmisc = dev_get_drvdata(data->dev); in imx_usbmisc_pullup()
1350 if (usbmisc->ops->pullup) in imx_usbmisc_pullup()
1351 usbmisc->ops->pullup(data, on); in imx_usbmisc_pullup()
1353 return 0; in imx_usbmisc_pullup()
1360 int ret = 0; in imx_usbmisc_suspend()
1363 return 0; in imx_usbmisc_suspend()
1365 usbmisc = dev_get_drvdata(data->dev); in imx_usbmisc_suspend()
1367 if (usbmisc->ops->vbus_comparator_on) in imx_usbmisc_suspend()
1368 usbmisc->ops->vbus_comparator_on(data, false); in imx_usbmisc_suspend()
1370 if (wakeup && usbmisc->ops->set_wakeup) in imx_usbmisc_suspend()
1371 ret = usbmisc->ops->set_wakeup(data, true); in imx_usbmisc_suspend()
1373 dev_err(data->dev, "set_wakeup failed, ret=%d\n", ret); in imx_usbmisc_suspend()
1377 if (usbmisc->ops->hsic_set_clk && data->hsic) in imx_usbmisc_suspend()
1378 ret = usbmisc->ops->hsic_set_clk(data, false); in imx_usbmisc_suspend()
1380 dev_err(data->dev, "hsic_set_clk failed, ret=%d\n", ret); in imx_usbmisc_suspend()
1391 int ret = 0; in imx_usbmisc_resume()
1394 return 0; in imx_usbmisc_resume()
1396 usbmisc = dev_get_drvdata(data->dev); in imx_usbmisc_resume()
1398 if (usbmisc->ops->power_lost_check) in imx_usbmisc_resume()
1399 ret = usbmisc->ops->power_lost_check(data); in imx_usbmisc_resume()
1400 if (ret > 0) { in imx_usbmisc_resume()
1401 /* re-init if resume from power lost */ in imx_usbmisc_resume()
1404 dev_err(data->dev, "re-init failed, ret=%d\n", ret); in imx_usbmisc_resume()
1409 if (wakeup && usbmisc->ops->set_wakeup) in imx_usbmisc_resume()
1410 ret = usbmisc->ops->set_wakeup(data, false); in imx_usbmisc_resume()
1412 dev_err(data->dev, "set_wakeup failed, ret=%d\n", ret); in imx_usbmisc_resume()
1416 if (usbmisc->ops->hsic_set_clk && data->hsic) in imx_usbmisc_resume()
1417 ret = usbmisc->ops->hsic_set_clk(data, true); in imx_usbmisc_resume()
1419 dev_err(data->dev, "hsic_set_clk failed, ret=%d\n", ret); in imx_usbmisc_resume()
1423 if (usbmisc->ops->vbus_comparator_on) in imx_usbmisc_resume()
1424 usbmisc->ops->vbus_comparator_on(data, true); in imx_usbmisc_resume()
1426 return 0; in imx_usbmisc_resume()
1429 if (wakeup && usbmisc->ops->set_wakeup) in imx_usbmisc_resume()
1430 usbmisc->ops->set_wakeup(data, true); in imx_usbmisc_resume()
1437 .compatible = "fsl,imx25-usbmisc",
1441 .compatible = "fsl,imx35-usbmisc",
1445 .compatible = "fsl,imx27-usbmisc",
1449 .compatible = "fsl,imx51-usbmisc",
1453 .compatible = "fsl,imx53-usbmisc",
1457 .compatible = "fsl,imx6q-usbmisc",
1461 .compatible = "fsl,vf610-usbmisc",
1465 .compatible = "fsl,imx6sx-usbmisc",
1469 .compatible = "fsl,imx6ul-usbmisc",
1473 .compatible = "fsl,imx7d-usbmisc",
1477 .compatible = "fsl,imx7ulp-usbmisc",
1481 .compatible = "fsl,imx8ulp-usbmisc",
1485 .compatible = "fsl,imx95-usbmisc",
1489 .compatible = "nxp,s32g2-usbmisc",
1493 .compatible = "nxp,s32g3-usbmisc",
1505 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); in usbmisc_imx_probe()
1507 return -ENOMEM; in usbmisc_imx_probe()
1509 spin_lock_init(&data->lock); in usbmisc_imx_probe()
1511 data->base = devm_platform_ioremap_resource(pdev, 0); in usbmisc_imx_probe()
1512 if (IS_ERR(data->base)) in usbmisc_imx_probe()
1513 return PTR_ERR(data->base); in usbmisc_imx_probe()
1517 data->blkctl = devm_ioremap_resource(&pdev->dev, res); in usbmisc_imx_probe()
1518 if (IS_ERR(data->blkctl)) in usbmisc_imx_probe()
1519 return PTR_ERR(data->blkctl); in usbmisc_imx_probe()
1520 } else if (device_is_compatible(&pdev->dev, "fsl,imx95-usbmisc")) { in usbmisc_imx_probe()
1521 dev_warn(&pdev->dev, "wakeup setting is missing\n"); in usbmisc_imx_probe()
1524 data->ops = of_device_get_match_data(&pdev->dev); in usbmisc_imx_probe()
1527 return 0; in usbmisc_imx_probe()
1540 MODULE_ALIAS("platform:usbmisc-imx");
1542 MODULE_DESCRIPTION("driver for imx usb non-core registers");