Lines Matching refs:ssusb

22 int ssusb_check_clocks(struct ssusb_mtk *ssusb, u32 ex_clks)  in ssusb_check_clocks()  argument
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()
48 static int ssusb_phy_init(struct ssusb_mtk *ssusb) in ssusb_phy_init() argument
53 for (i = 0; i < ssusb->num_phys; i++) { in ssusb_phy_init()
54 ret = phy_init(ssusb->phys[i]); in ssusb_phy_init()
62 phy_exit(ssusb->phys[i - 1]); in ssusb_phy_init()
67 static int ssusb_phy_exit(struct ssusb_mtk *ssusb) in ssusb_phy_exit() argument
71 for (i = 0; i < ssusb->num_phys; i++) in ssusb_phy_exit()
72 phy_exit(ssusb->phys[i]); in ssusb_phy_exit()
77 static int ssusb_phy_power_on(struct ssusb_mtk *ssusb) in ssusb_phy_power_on() argument
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()
91 phy_power_off(ssusb->phys[i - 1]); in ssusb_phy_power_on()
96 static void ssusb_phy_power_off(struct ssusb_mtk *ssusb) in ssusb_phy_power_off() argument
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()
104 static int ssusb_clks_enable(struct ssusb_mtk *ssusb) in ssusb_clks_enable() argument
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()
144 static void ssusb_clks_disable(struct ssusb_mtk *ssusb) in ssusb_clks_disable() argument
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()
152 static int ssusb_rscs_init(struct ssusb_mtk *ssusb) in ssusb_rscs_init() argument
156 ret = regulator_enable(ssusb->vusb33); in ssusb_rscs_init()
158 dev_err(ssusb->dev, "failed to enable vusb33\n"); in ssusb_rscs_init()
162 ret = ssusb_clks_enable(ssusb); in ssusb_rscs_init()
166 ret = ssusb_phy_init(ssusb); in ssusb_rscs_init()
168 dev_err(ssusb->dev, "failed to init phy\n"); in ssusb_rscs_init()
172 ret = ssusb_phy_power_on(ssusb); in ssusb_rscs_init()
174 dev_err(ssusb->dev, "failed to power on phy\n"); in ssusb_rscs_init()
181 ssusb_phy_exit(ssusb); in ssusb_rscs_init()
183 ssusb_clks_disable(ssusb); in ssusb_rscs_init()
185 regulator_disable(ssusb->vusb33); in ssusb_rscs_init()
190 static void ssusb_rscs_exit(struct ssusb_mtk *ssusb) in ssusb_rscs_exit() argument
192 ssusb_clks_disable(ssusb); in ssusb_rscs_exit()
193 regulator_disable(ssusb->vusb33); in ssusb_rscs_exit()
194 ssusb_phy_power_off(ssusb); in ssusb_rscs_exit()
195 ssusb_phy_exit(ssusb); in ssusb_rscs_exit()
198 static void ssusb_ip_sw_reset(struct ssusb_mtk *ssusb) in ssusb_ip_sw_reset() argument
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()
211 mtu3_setbits(ssusb->ippc_base, U3D_SSUSB_IP_PW_CTRL2, SSUSB_IP_DEV_PDN); in ssusb_ip_sw_reset()
214 static int get_ssusb_rscs(struct platform_device *pdev, struct ssusb_mtk *ssusb) in get_ssusb_rscs() argument
217 struct otg_switch_mtk *otg_sx = &ssusb->otg_switch; 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()
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()
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()
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()
277 ret = ssusb_wakeup_of_property_parse(ssusb, node); in get_ssusb_rscs()
285 &ssusb->u3p_dis_msk); in get_ssusb_rscs()
293 if (ssusb->dr_mode == USB_DR_MODE_HOST) in get_ssusb_rscs()
303 otg_sx->edev = extcon_get_edev_by_phandle(ssusb->dev, 0); in get_ssusb_rscs()
305 dev_err(ssusb->dev, "couldn't get extcon device\n"); in get_ssusb_rscs()
312 ssusb->dr_mode, otg_sx->is_u3_drd, ssusb->u3p_dis_msk, in get_ssusb_rscs()
322 struct ssusb_mtk *ssusb; in mtu3_probe() local
326 ssusb = devm_kzalloc(dev, sizeof(*ssusb), GFP_KERNEL); in mtu3_probe()
327 if (!ssusb) in mtu3_probe()
336 platform_set_drvdata(pdev, ssusb); in mtu3_probe()
337 ssusb->dev = dev; in mtu3_probe()
339 ret = get_ssusb_rscs(pdev, ssusb); in mtu3_probe()
343 ssusb_debugfs_create_root(ssusb); in mtu3_probe()
350 ret = ssusb_rscs_init(ssusb); in mtu3_probe()
354 ssusb_ip_sw_reset(ssusb); 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()
366 ret = ssusb_gadget_init(ssusb); in mtu3_probe()
373 ret = ssusb_host_init(ssusb, node); in mtu3_probe()
380 ret = ssusb_gadget_init(ssusb); in mtu3_probe()
386 ret = ssusb_host_init(ssusb, node); in mtu3_probe()
392 ret = ssusb_otg_switch_init(ssusb); in mtu3_probe()
399 dev_err(dev, "unsupported mode: %d\n", ssusb->dr_mode); in mtu3_probe()
407 ssusb_host_exit(ssusb); in mtu3_probe()
409 ssusb_gadget_exit(ssusb); in mtu3_probe()
411 ssusb_rscs_exit(ssusb); in mtu3_probe()
415 ssusb_debugfs_remove_root(ssusb); in mtu3_probe()
422 struct ssusb_mtk *ssusb = platform_get_drvdata(pdev); in mtu3_remove() local
424 switch (ssusb->dr_mode) { in mtu3_remove()
426 ssusb_gadget_exit(ssusb); in mtu3_remove()
429 ssusb_host_exit(ssusb); in mtu3_remove()
432 ssusb_otg_switch_exit(ssusb); in mtu3_remove()
433 ssusb_gadget_exit(ssusb); in mtu3_remove()
434 ssusb_host_exit(ssusb); in mtu3_remove()
440 ssusb_rscs_exit(ssusb); in mtu3_remove()
443 ssusb_debugfs_remove_root(ssusb); in mtu3_remove()
454 struct ssusb_mtk *ssusb = dev_get_drvdata(dev); in mtu3_suspend() local
459 if (!ssusb->is_host) in mtu3_suspend()
462 ssusb_host_disable(ssusb, true); in mtu3_suspend()
463 ssusb_phy_power_off(ssusb); in mtu3_suspend()
464 ssusb_clks_disable(ssusb); in mtu3_suspend()
465 ssusb_wakeup_set(ssusb, true); in mtu3_suspend()
472 struct ssusb_mtk *ssusb = dev_get_drvdata(dev); in mtu3_resume() local
477 if (!ssusb->is_host) in mtu3_resume()
480 ssusb_wakeup_set(ssusb, false); in mtu3_resume()
481 ret = ssusb_clks_enable(ssusb); in mtu3_resume()
485 ret = ssusb_phy_power_on(ssusb); in mtu3_resume()
489 ssusb_host_enable(ssusb); in mtu3_resume()
494 ssusb_clks_disable(ssusb); in mtu3_resume()