Lines Matching +full:keep +full:- +full:power +full:- +full:in +full:- +full:suspend
1 // SPDX-License-Identifier: GPL-2.0
3 * mtu3_dr.c - dual role switch and host glue layer
38 * ip-sleep wakeup mode:
39 * all clocks can be turn off, but power domain should be kept on
45 switch (ssusb->uwk_vers) { in ssusb_wakeup_ip_sleep_set()
47 reg = ssusb->uwk_reg_base + PERI_WK_CTRL1; in ssusb_wakeup_ip_sleep_set()
52 reg = ssusb->uwk_reg_base + PERI_SSUSB_SPM_CTRL; in ssusb_wakeup_ip_sleep_set()
59 regmap_update_bits(ssusb->uwk, reg, msk, val); in ssusb_wakeup_ip_sleep_set()
69 ssusb->uwk_en = of_property_read_bool(dn, "wakeup-source"); in ssusb_wakeup_of_property_parse()
70 if (!ssusb->uwk_en) in ssusb_wakeup_of_property_parse()
74 "mediatek,syscon-wakeup", 2, 0, &args); in ssusb_wakeup_of_property_parse()
78 ssusb->uwk_reg_base = args.args[0]; in ssusb_wakeup_of_property_parse()
79 ssusb->uwk_vers = args.args[1]; in ssusb_wakeup_of_property_parse()
80 ssusb->uwk = syscon_node_to_regmap(args.np); in ssusb_wakeup_of_property_parse()
82 dev_info(ssusb->dev, "uwk - reg:0x%x, version:%d\n", in ssusb_wakeup_of_property_parse()
83 ssusb->uwk_reg_base, ssusb->uwk_vers); in ssusb_wakeup_of_property_parse()
85 return PTR_ERR_OR_ZERO(ssusb->uwk); in ssusb_wakeup_of_property_parse()
90 if (ssusb->uwk_en) in ssusb_wakeup_set()
98 xhci_cap = mtu3_readl(ssusb->ippc_base, U3D_SSUSB_IP_XHCI_CAP); in host_ports_num_get()
99 ssusb->u2_ports = SSUSB_IP_XHCI_U2_PORT_NUM(xhci_cap); in host_ports_num_get()
100 ssusb->u3_ports = SSUSB_IP_XHCI_U3_PORT_NUM(xhci_cap); in host_ports_num_get()
102 dev_dbg(ssusb->dev, "host - u2_ports:%d, u3_ports:%d\n", in host_ports_num_get()
103 ssusb->u2_ports, ssusb->u3_ports); in host_ports_num_get()
109 void __iomem *ibase = ssusb->ippc_base; in ssusb_host_enable()
110 int num_u3p = ssusb->u3_ports; in ssusb_host_enable()
111 int num_u2p = ssusb->u2_ports; in ssusb_host_enable()
117 /* power on host ip */ in ssusb_host_enable()
120 /* power on and enable u3 ports except skipped ones */ in ssusb_host_enable()
123 if ((0x1 << i) & ssusb->u3p_dis_msk) { in ssusb_host_enable()
134 /* power on and enable all u2 ports */ in ssusb_host_enable()
149 int ssusb_host_disable(struct ssusb_mtk *ssusb, bool suspend) in ssusb_host_disable() argument
151 void __iomem *ibase = ssusb->ippc_base; in ssusb_host_disable()
152 int num_u3p = ssusb->u3_ports; in ssusb_host_disable()
153 int num_u2p = ssusb->u2_ports; in ssusb_host_disable()
158 /* power down and disable u3 ports except skipped ones */ in ssusb_host_disable()
160 if ((0x1 << i) & ssusb->u3p_dis_msk) in ssusb_host_disable()
165 value |= suspend ? 0 : SSUSB_U3_PORT_DIS; in ssusb_host_disable()
169 /* power down and disable all u2 ports */ in ssusb_host_disable()
173 value |= suspend ? 0 : SSUSB_U2_PORT_DIS; in ssusb_host_disable()
177 /* power down host ip */ in ssusb_host_disable()
180 if (!suspend) in ssusb_host_disable()
187 dev_err(ssusb->dev, "ip sleep failed!!!\n"); in ssusb_host_disable()
194 struct otg_switch_mtk *otg_sx = &ssusb->otg_switch; in ssusb_host_setup()
199 * power on host and power on/enable all ports in ssusb_host_setup()
204 if (otg_sx->manual_drd_enabled) in ssusb_host_setup()
207 /* if port0 supports dual-role, works as host mode by default */ in ssusb_host_setup()
208 ssusb_set_vbus(&ssusb->otg_switch, 1); in ssusb_host_setup()
213 if (ssusb->is_host) in ssusb_host_cleanup()
214 ssusb_set_vbus(&ssusb->otg_switch, 0); in ssusb_host_cleanup()
221 * which supports OTG are better to be enabled by default in DTS.
222 * Because the host driver will keep link with devices attached when system
223 * enters suspend mode, so no need to control VBUSes after initialization.
227 struct device *parent_dev = ssusb->dev; in ssusb_host_init()
246 of_platform_depopulate(ssusb->dev); in ssusb_host_exit()