• Home
  • Raw
  • Download

Lines Matching +full:mt8173 +full:- +full:mtu3

1 // SPDX-License-Identifier: GPL-2.0
9 #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()
53 for (i = 0; i < ssusb->num_phys; i++) { in ssusb_phy_init()
54 ret = phy_init(ssusb->phys[i]); in ssusb_phy_init()
61 for (; i > 0; i--) in ssusb_phy_init()
62 phy_exit(ssusb->phys[i - 1]); in ssusb_phy_init()
71 for (i = 0; i < ssusb->num_phys; i++) in ssusb_phy_exit()
72 phy_exit(ssusb->phys[i]); in ssusb_phy_exit()
82 for (i = 0; i < ssusb->num_phys; i++) { in ssusb_phy_power_on()
83 ret = phy_power_on(ssusb->phys[i]); in ssusb_phy_power_on()
90 for (; i > 0; i--) in ssusb_phy_power_on()
91 phy_power_off(ssusb->phys[i - 1]); in ssusb_phy_power_on()
100 for (i = 0; i < ssusb->num_phys; i++) in ssusb_phy_power_off()
101 phy_power_off(ssusb->phys[i]); in ssusb_phy_power_off()
108 ret = clk_prepare_enable(ssusb->sys_clk); in ssusb_clks_enable()
110 dev_err(ssusb->dev, "failed to enable sys_clk\n"); in ssusb_clks_enable()
114 ret = clk_prepare_enable(ssusb->ref_clk); in ssusb_clks_enable()
116 dev_err(ssusb->dev, "failed to enable ref_clk\n"); in ssusb_clks_enable()
120 ret = clk_prepare_enable(ssusb->mcu_clk); in ssusb_clks_enable()
122 dev_err(ssusb->dev, "failed to enable mcu_clk\n"); in ssusb_clks_enable()
126 ret = clk_prepare_enable(ssusb->dma_clk); in ssusb_clks_enable()
128 dev_err(ssusb->dev, "failed to enable dma_clk\n"); in ssusb_clks_enable()
135 clk_disable_unprepare(ssusb->mcu_clk); in ssusb_clks_enable()
137 clk_disable_unprepare(ssusb->ref_clk); in ssusb_clks_enable()
139 clk_disable_unprepare(ssusb->sys_clk); in ssusb_clks_enable()
146 clk_disable_unprepare(ssusb->dma_clk); in ssusb_clks_disable()
147 clk_disable_unprepare(ssusb->mcu_clk); in ssusb_clks_disable()
148 clk_disable_unprepare(ssusb->ref_clk); in ssusb_clks_disable()
149 clk_disable_unprepare(ssusb->sys_clk); in ssusb_clks_disable()
156 ret = regulator_enable(ssusb->vusb33); in ssusb_rscs_init()
158 dev_err(ssusb->dev, "failed to enable vusb33\n"); in ssusb_rscs_init()
168 dev_err(ssusb->dev, "failed to init phy\n"); in ssusb_rscs_init()
174 dev_err(ssusb->dev, "failed to power on phy\n"); in ssusb_rscs_init()
185 regulator_disable(ssusb->vusb33); in ssusb_rscs_init()
193 regulator_disable(ssusb->vusb33); in ssusb_rscs_exit()
201 mtu3_setbits(ssusb->ippc_base, U3D_SSUSB_IP_PW_CTRL0, SSUSB_IP_SW_RST); in ssusb_ip_sw_reset()
203 mtu3_clrbits(ssusb->ippc_base, U3D_SSUSB_IP_PW_CTRL0, SSUSB_IP_SW_RST); in ssusb_ip_sw_reset()
208 * power down device ip, otherwise ip-sleep will fail when working as in ssusb_ip_sw_reset()
211 mtu3_setbits(ssusb->ippc_base, U3D_SSUSB_IP_PW_CTRL2, SSUSB_IP_DEV_PDN); in ssusb_ip_sw_reset()
216 struct device_node *node = pdev->dev.of_node; in get_ssusb_rscs()
217 struct otg_switch_mtk *otg_sx = &ssusb->otg_switch; in get_ssusb_rscs()
218 struct device *dev = &pdev->dev; in get_ssusb_rscs()
222 ssusb->vusb33 = devm_regulator_get(dev, "vusb33"); in get_ssusb_rscs()
223 if (IS_ERR(ssusb->vusb33)) { in get_ssusb_rscs()
225 return PTR_ERR(ssusb->vusb33); in get_ssusb_rscs()
228 ssusb->sys_clk = devm_clk_get(dev, "sys_ck"); in get_ssusb_rscs()
229 if (IS_ERR(ssusb->sys_clk)) { in get_ssusb_rscs()
231 return PTR_ERR(ssusb->sys_clk); in get_ssusb_rscs()
234 ssusb->ref_clk = devm_clk_get_optional(dev, "ref_ck"); in get_ssusb_rscs()
235 if (IS_ERR(ssusb->ref_clk)) in get_ssusb_rscs()
236 return PTR_ERR(ssusb->ref_clk); in get_ssusb_rscs()
238 ssusb->mcu_clk = devm_clk_get_optional(dev, "mcu_ck"); in get_ssusb_rscs()
239 if (IS_ERR(ssusb->mcu_clk)) in get_ssusb_rscs()
240 return PTR_ERR(ssusb->mcu_clk); in get_ssusb_rscs()
242 ssusb->dma_clk = devm_clk_get_optional(dev, "dma_ck"); in get_ssusb_rscs()
243 if (IS_ERR(ssusb->dma_clk)) in get_ssusb_rscs()
244 return PTR_ERR(ssusb->dma_clk); in get_ssusb_rscs()
246 ssusb->num_phys = of_count_phandle_with_args(node, in get_ssusb_rscs()
247 "phys", "#phy-cells"); in get_ssusb_rscs()
248 if (ssusb->num_phys > 0) { in get_ssusb_rscs()
249 ssusb->phys = devm_kcalloc(dev, ssusb->num_phys, in get_ssusb_rscs()
250 sizeof(*ssusb->phys), GFP_KERNEL); in get_ssusb_rscs()
251 if (!ssusb->phys) in get_ssusb_rscs()
252 return -ENOMEM; in get_ssusb_rscs()
254 ssusb->num_phys = 0; in get_ssusb_rscs()
257 for (i = 0; i < ssusb->num_phys; i++) { in get_ssusb_rscs()
258 ssusb->phys[i] = devm_of_phy_get_by_index(dev, node, i); in get_ssusb_rscs()
259 if (IS_ERR(ssusb->phys[i])) { in get_ssusb_rscs()
260 dev_err(dev, "failed to get phy-%d\n", i); in get_ssusb_rscs()
261 return PTR_ERR(ssusb->phys[i]); in get_ssusb_rscs()
265 ssusb->ippc_base = devm_platform_ioremap_resource_byname(pdev, "ippc"); in get_ssusb_rscs()
266 if (IS_ERR(ssusb->ippc_base)) in get_ssusb_rscs()
267 return PTR_ERR(ssusb->ippc_base); in get_ssusb_rscs()
269 ssusb->dr_mode = usb_get_dr_mode(dev); in get_ssusb_rscs()
270 if (ssusb->dr_mode == USB_DR_MODE_UNKNOWN) in get_ssusb_rscs()
271 ssusb->dr_mode = USB_DR_MODE_OTG; in get_ssusb_rscs()
273 if (ssusb->dr_mode == USB_DR_MODE_PERIPHERAL) in get_ssusb_rscs()
284 of_property_read_u32(node, "mediatek,u3p-dis-msk", in get_ssusb_rscs()
285 &ssusb->u3p_dis_msk); in get_ssusb_rscs()
287 otg_sx->vbus = devm_regulator_get(dev, "vbus"); in get_ssusb_rscs()
288 if (IS_ERR(otg_sx->vbus)) { in get_ssusb_rscs()
290 return PTR_ERR(otg_sx->vbus); in get_ssusb_rscs()
293 if (ssusb->dr_mode == USB_DR_MODE_HOST) in get_ssusb_rscs()
296 /* if dual-role mode is supported */ in get_ssusb_rscs()
297 otg_sx->is_u3_drd = of_property_read_bool(node, "mediatek,usb3-drd"); in get_ssusb_rscs()
298 otg_sx->manual_drd_enabled = in get_ssusb_rscs()
299 of_property_read_bool(node, "enable-manual-drd"); in get_ssusb_rscs()
300 otg_sx->role_sw_used = of_property_read_bool(node, "usb-role-switch"); in get_ssusb_rscs()
302 if (!otg_sx->role_sw_used && of_property_read_bool(node, "extcon")) { in get_ssusb_rscs()
303 otg_sx->edev = extcon_get_edev_by_phandle(ssusb->dev, 0); in get_ssusb_rscs()
304 if (IS_ERR(otg_sx->edev)) { in get_ssusb_rscs()
305 dev_err(ssusb->dev, "couldn't get extcon device\n"); in get_ssusb_rscs()
306 return PTR_ERR(otg_sx->edev); in get_ssusb_rscs()
312 ssusb->dr_mode, otg_sx->is_u3_drd, ssusb->u3p_dis_msk, in get_ssusb_rscs()
313 otg_sx->manual_drd_enabled ? "manual" : "auto"); in get_ssusb_rscs()
320 struct device_node *node = pdev->dev.of_node; in mtu3_probe()
321 struct device *dev = &pdev->dev; in mtu3_probe()
323 int ret = -ENOMEM; in mtu3_probe()
328 return -ENOMEM; in mtu3_probe()
333 return -ENOTSUPP; in mtu3_probe()
337 ssusb->dev = dev; in mtu3_probe()
357 ssusb->dr_mode = USB_DR_MODE_HOST; in mtu3_probe()
359 ssusb->dr_mode = USB_DR_MODE_PERIPHERAL; in mtu3_probe()
362 ssusb->is_host = !(ssusb->dr_mode == USB_DR_MODE_PERIPHERAL); in mtu3_probe()
364 switch (ssusb->dr_mode) { in mtu3_probe()
399 dev_err(dev, "unsupported mode: %d\n", ssusb->dr_mode); in mtu3_probe()
400 ret = -EINVAL; in mtu3_probe()
424 switch (ssusb->dr_mode) { in mtu3_remove()
437 return -EINVAL; in mtu3_remove()
441 pm_runtime_put_sync(&pdev->dev); in mtu3_remove()
442 pm_runtime_disable(&pdev->dev); in mtu3_remove()
449 * when support dual-role mode, we reject suspend when
459 if (!ssusb->is_host) in mtu3_suspend()
477 if (!ssusb->is_host) in mtu3_resume()
508 {.compatible = "mediatek,mt8173-mtu3",},
509 {.compatible = "mediatek,mtu3",},