Lines Matching +full:mt8173 +full:- +full:mtu3
1 // SPDX-License-Identifier: GPL-2.0
8 #include <linux/dma-mapping.h>
17 #include "mtu3.h"
21 /* u2-port0 should be powered on and enabled; */
24 void __iomem *ibase = ssusb->ippc_base; in ssusb_check_clocks()
34 dev_err(ssusb->dev, "clks of sts1 are not stable!\n"); in ssusb_check_clocks()
41 dev_err(ssusb->dev, "mac2 clock is not stable\n"); in ssusb_check_clocks()
54 if (!ssusb->is_host) in wait_for_ip_sleep()
61 ret = readl_poll_timeout(ssusb->ippc_base + U3D_SSUSB_IP_PW_STS1, value, in wait_for_ip_sleep()
64 dev_err(ssusb->dev, "ip sleep failed!!!\n"); in wait_for_ip_sleep()
65 ret = -EBUSY; in wait_for_ip_sleep()
79 for (i = 0; i < ssusb->num_phys; i++) { in ssusb_phy_init()
80 ret = phy_init(ssusb->phys[i]); in ssusb_phy_init()
87 for (; i > 0; i--) in ssusb_phy_init()
88 phy_exit(ssusb->phys[i - 1]); in ssusb_phy_init()
97 for (i = 0; i < ssusb->num_phys; i++) in ssusb_phy_exit()
98 phy_exit(ssusb->phys[i]); in ssusb_phy_exit()
108 for (i = 0; i < ssusb->num_phys; i++) { in ssusb_phy_power_on()
109 ret = phy_power_on(ssusb->phys[i]); in ssusb_phy_power_on()
116 for (; i > 0; i--) in ssusb_phy_power_on()
117 phy_power_off(ssusb->phys[i - 1]); in ssusb_phy_power_on()
126 for (i = 0; i < ssusb->num_phys; i++) in ssusb_phy_power_off()
127 phy_power_off(ssusb->phys[i]); in ssusb_phy_power_off()
134 ret = regulator_enable(ssusb->vusb33); in ssusb_rscs_init()
136 dev_err(ssusb->dev, "failed to enable vusb33\n"); in ssusb_rscs_init()
140 ret = clk_bulk_prepare_enable(BULK_CLKS_CNT, ssusb->clks); in ssusb_rscs_init()
146 dev_err(ssusb->dev, "failed to init phy\n"); in ssusb_rscs_init()
152 dev_err(ssusb->dev, "failed to power on phy\n"); in ssusb_rscs_init()
161 clk_bulk_disable_unprepare(BULK_CLKS_CNT, ssusb->clks); in ssusb_rscs_init()
163 regulator_disable(ssusb->vusb33); in ssusb_rscs_init()
170 clk_bulk_disable_unprepare(BULK_CLKS_CNT, ssusb->clks); in ssusb_rscs_exit()
171 regulator_disable(ssusb->vusb33); in ssusb_rscs_exit()
179 mtu3_setbits(ssusb->ippc_base, U3D_SSUSB_IP_PW_CTRL0, SSUSB_IP_SW_RST); in ssusb_ip_sw_reset()
181 mtu3_clrbits(ssusb->ippc_base, U3D_SSUSB_IP_PW_CTRL0, SSUSB_IP_SW_RST); in ssusb_ip_sw_reset()
186 * power down device ip, otherwise ip-sleep will fail when working as in ssusb_ip_sw_reset()
189 mtu3_setbits(ssusb->ippc_base, U3D_SSUSB_IP_PW_CTRL2, SSUSB_IP_DEV_PDN); in ssusb_ip_sw_reset()
194 struct device_node *node = pdev->dev.of_node; in get_ssusb_rscs()
195 struct otg_switch_mtk *otg_sx = &ssusb->otg_switch; in get_ssusb_rscs()
196 struct clk_bulk_data *clks = ssusb->clks; in get_ssusb_rscs()
197 struct device *dev = &pdev->dev; in get_ssusb_rscs()
201 ssusb->vusb33 = devm_regulator_get(dev, "vusb33"); in get_ssusb_rscs()
202 if (IS_ERR(ssusb->vusb33)) { in get_ssusb_rscs()
204 return PTR_ERR(ssusb->vusb33); in get_ssusb_rscs()
215 ssusb->num_phys = of_count_phandle_with_args(node, in get_ssusb_rscs()
216 "phys", "#phy-cells"); in get_ssusb_rscs()
217 if (ssusb->num_phys > 0) { in get_ssusb_rscs()
218 ssusb->phys = devm_kcalloc(dev, ssusb->num_phys, in get_ssusb_rscs()
219 sizeof(*ssusb->phys), GFP_KERNEL); in get_ssusb_rscs()
220 if (!ssusb->phys) in get_ssusb_rscs()
221 return -ENOMEM; in get_ssusb_rscs()
223 ssusb->num_phys = 0; in get_ssusb_rscs()
226 for (i = 0; i < ssusb->num_phys; i++) { in get_ssusb_rscs()
227 ssusb->phys[i] = devm_of_phy_get_by_index(dev, node, i); in get_ssusb_rscs()
228 if (IS_ERR(ssusb->phys[i])) { in get_ssusb_rscs()
229 dev_err(dev, "failed to get phy-%d\n", i); in get_ssusb_rscs()
230 return PTR_ERR(ssusb->phys[i]); in get_ssusb_rscs()
234 ssusb->ippc_base = devm_platform_ioremap_resource_byname(pdev, "ippc"); in get_ssusb_rscs()
235 if (IS_ERR(ssusb->ippc_base)) in get_ssusb_rscs()
236 return PTR_ERR(ssusb->ippc_base); in get_ssusb_rscs()
238 ssusb->wakeup_irq = platform_get_irq_byname_optional(pdev, "wakeup"); in get_ssusb_rscs()
239 if (ssusb->wakeup_irq == -EPROBE_DEFER) in get_ssusb_rscs()
240 return ssusb->wakeup_irq; in get_ssusb_rscs()
242 ssusb->dr_mode = usb_get_dr_mode(dev); in get_ssusb_rscs()
243 if (ssusb->dr_mode == USB_DR_MODE_UNKNOWN) in get_ssusb_rscs()
244 ssusb->dr_mode = USB_DR_MODE_OTG; in get_ssusb_rscs()
246 if (ssusb->dr_mode == USB_DR_MODE_PERIPHERAL) in get_ssusb_rscs()
257 of_property_read_u32(node, "mediatek,u3p-dis-msk", in get_ssusb_rscs()
258 &ssusb->u3p_dis_msk); in get_ssusb_rscs()
259 of_property_read_u32(node, "mediatek,u2p-dis-msk", in get_ssusb_rscs()
260 &ssusb->u2p_dis_msk); in get_ssusb_rscs()
262 otg_sx->vbus = devm_regulator_get(dev, "vbus"); in get_ssusb_rscs()
263 if (IS_ERR(otg_sx->vbus)) { in get_ssusb_rscs()
265 return PTR_ERR(otg_sx->vbus); in get_ssusb_rscs()
268 if (ssusb->dr_mode == USB_DR_MODE_HOST) in get_ssusb_rscs()
271 /* if dual-role mode is supported */ in get_ssusb_rscs()
272 otg_sx->is_u3_drd = of_property_read_bool(node, "mediatek,usb3-drd"); in get_ssusb_rscs()
273 otg_sx->manual_drd_enabled = in get_ssusb_rscs()
274 of_property_read_bool(node, "enable-manual-drd"); in get_ssusb_rscs()
275 otg_sx->role_sw_used = of_property_read_bool(node, "usb-role-switch"); in get_ssusb_rscs()
277 /* can't disable port0 when use dual-role mode */ in get_ssusb_rscs()
278 ssusb->u2p_dis_msk &= ~0x1; in get_ssusb_rscs()
280 if (otg_sx->role_sw_used || otg_sx->manual_drd_enabled) in get_ssusb_rscs()
284 otg_sx->edev = extcon_get_edev_by_phandle(ssusb->dev, 0); in get_ssusb_rscs()
285 if (IS_ERR(otg_sx->edev)) { in get_ssusb_rscs()
286 return dev_err_probe(dev, PTR_ERR(otg_sx->edev), in get_ssusb_rscs()
293 ssusb->dr_mode, otg_sx->is_u3_drd, in get_ssusb_rscs()
294 otg_sx->manual_drd_enabled ? "manual" : "auto"); in get_ssusb_rscs()
296 ssusb->u2p_dis_msk, ssusb->u3p_dis_msk); in get_ssusb_rscs()
303 struct device_node *node = pdev->dev.of_node; in mtu3_probe()
304 struct device *dev = &pdev->dev; in mtu3_probe()
306 int ret = -ENOMEM; in mtu3_probe()
311 return -ENOMEM; in mtu3_probe()
316 return -ENOTSUPP; in mtu3_probe()
320 ssusb->dev = dev; in mtu3_probe()
339 if (ssusb->wakeup_irq > 0) { in mtu3_probe()
340 ret = dev_pm_set_dedicated_wake_irq(dev, ssusb->wakeup_irq); in mtu3_probe()
342 dev_err(dev, "failed to set wakeup irq %d\n", ssusb->wakeup_irq); in mtu3_probe()
345 dev_info(dev, "wakeup irq %d\n", ssusb->wakeup_irq); in mtu3_probe()
351 ssusb->dr_mode = USB_DR_MODE_HOST; in mtu3_probe()
353 ssusb->dr_mode = USB_DR_MODE_PERIPHERAL; in mtu3_probe()
356 ssusb->is_host = !(ssusb->dr_mode == USB_DR_MODE_PERIPHERAL); in mtu3_probe()
358 switch (ssusb->dr_mode) { in mtu3_probe()
393 dev_err(dev, "unsupported mode: %d\n", ssusb->dr_mode); in mtu3_probe()
394 ret = -EINVAL; in mtu3_probe()
423 pm_runtime_get_sync(&pdev->dev); in mtu3_remove()
425 switch (ssusb->dr_mode) { in mtu3_remove()
438 return -EINVAL; in mtu3_remove()
443 pm_runtime_disable(&pdev->dev); in mtu3_remove()
444 pm_runtime_put_noidle(&pdev->dev); in mtu3_remove()
445 pm_runtime_set_suspended(&pdev->dev); in mtu3_remove()
452 switch (ssusb->dr_mode) { in resume_ip_and_ports()
460 ssusb_host_resume(ssusb, !ssusb->is_host); in resume_ip_and_ports()
461 if (!ssusb->is_host) in resume_ip_and_ports()
466 return -EINVAL; in resume_ip_and_ports()
479 switch (ssusb->dr_mode) { in mtu3_suspend_common()
490 if (!ssusb->is_host) { in mtu3_suspend_common()
498 return -EINVAL; in mtu3_suspend_common()
506 clk_bulk_disable_unprepare(BULK_CLKS_CNT, ssusb->clks); in mtu3_suspend_common()
524 ret = clk_bulk_prepare_enable(BULK_CLKS_CNT, ssusb->clks); in mtu3_resume_common()
535 clk_bulk_disable_unprepare(BULK_CLKS_CNT, ssusb->clks); in mtu3_resume_common()
575 {.compatible = "mediatek,mt8173-mtu3",},
576 {.compatible = "mediatek,mtu3",},