Lines Matching refs:ssusb

22 int ssusb_check_clocks(struct ssusb_mtk *ssusb, u32 ex_clks)
24 void __iomem *ibase = ssusb->ippc_base;
34 dev_err(ssusb->dev, "clks of sts1 are not stable!\n");
41 dev_err(ssusb->dev, "mac2 clock is not stable\n");
48 static int ssusb_phy_init(struct ssusb_mtk *ssusb)
53 for (i = 0; i < ssusb->num_phys; i++) {
54 ret = phy_init(ssusb->phys[i]);
62 phy_exit(ssusb->phys[i - 1]);
67 static int ssusb_phy_exit(struct ssusb_mtk *ssusb)
71 for (i = 0; i < ssusb->num_phys; i++)
72 phy_exit(ssusb->phys[i]);
77 static int ssusb_phy_power_on(struct ssusb_mtk *ssusb)
82 for (i = 0; i < ssusb->num_phys; i++) {
83 ret = phy_power_on(ssusb->phys[i]);
91 phy_power_off(ssusb->phys[i - 1]);
96 static void ssusb_phy_power_off(struct ssusb_mtk *ssusb)
100 for (i = 0; i < ssusb->num_phys; i++)
101 phy_power_off(ssusb->phys[i]);
104 static int ssusb_clks_enable(struct ssusb_mtk *ssusb)
108 ret = clk_prepare_enable(ssusb->sys_clk);
110 dev_err(ssusb->dev, "failed to enable sys_clk\n");
114 ret = clk_prepare_enable(ssusb->ref_clk);
116 dev_err(ssusb->dev, "failed to enable ref_clk\n");
120 ret = clk_prepare_enable(ssusb->mcu_clk);
122 dev_err(ssusb->dev, "failed to enable mcu_clk\n");
126 ret = clk_prepare_enable(ssusb->dma_clk);
128 dev_err(ssusb->dev, "failed to enable dma_clk\n");
135 clk_disable_unprepare(ssusb->mcu_clk);
137 clk_disable_unprepare(ssusb->ref_clk);
139 clk_disable_unprepare(ssusb->sys_clk);
144 static void ssusb_clks_disable(struct ssusb_mtk *ssusb)
146 clk_disable_unprepare(ssusb->dma_clk);
147 clk_disable_unprepare(ssusb->mcu_clk);
148 clk_disable_unprepare(ssusb->ref_clk);
149 clk_disable_unprepare(ssusb->sys_clk);
152 static int ssusb_rscs_init(struct ssusb_mtk *ssusb)
156 ret = regulator_enable(ssusb->vusb33);
158 dev_err(ssusb->dev, "failed to enable vusb33\n");
162 ret = ssusb_clks_enable(ssusb);
166 ret = ssusb_phy_init(ssusb);
168 dev_err(ssusb->dev, "failed to init phy\n");
172 ret = ssusb_phy_power_on(ssusb);
174 dev_err(ssusb->dev, "failed to power on phy\n");
181 ssusb_phy_exit(ssusb);
183 ssusb_clks_disable(ssusb);
185 regulator_disable(ssusb->vusb33);
190 static void ssusb_rscs_exit(struct ssusb_mtk *ssusb)
192 ssusb_clks_disable(ssusb);
193 regulator_disable(ssusb->vusb33);
194 ssusb_phy_power_off(ssusb);
195 ssusb_phy_exit(ssusb);
198 static void ssusb_ip_sw_reset(struct ssusb_mtk *ssusb)
201 mtu3_setbits(ssusb->ippc_base, U3D_SSUSB_IP_PW_CTRL0, SSUSB_IP_SW_RST);
203 mtu3_clrbits(ssusb->ippc_base, U3D_SSUSB_IP_PW_CTRL0, SSUSB_IP_SW_RST);
211 mtu3_setbits(ssusb->ippc_base, U3D_SSUSB_IP_PW_CTRL2, SSUSB_IP_DEV_PDN);
214 static int get_ssusb_rscs(struct platform_device *pdev, struct ssusb_mtk *ssusb)
217 struct otg_switch_mtk *otg_sx = &ssusb->otg_switch;
222 ssusb->vusb33 = devm_regulator_get(dev, "vusb33");
223 if (IS_ERR(ssusb->vusb33)) {
225 return PTR_ERR(ssusb->vusb33);
228 ssusb->sys_clk = devm_clk_get(dev, "sys_ck");
229 if (IS_ERR(ssusb->sys_clk)) {
231 return PTR_ERR(ssusb->sys_clk);
234 ssusb->ref_clk = devm_clk_get_optional(dev, "ref_ck");
235 if (IS_ERR(ssusb->ref_clk))
236 return PTR_ERR(ssusb->ref_clk);
238 ssusb->mcu_clk = devm_clk_get_optional(dev, "mcu_ck");
239 if (IS_ERR(ssusb->mcu_clk))
240 return PTR_ERR(ssusb->mcu_clk);
242 ssusb->dma_clk = devm_clk_get_optional(dev, "dma_ck");
243 if (IS_ERR(ssusb->dma_clk))
244 return PTR_ERR(ssusb->dma_clk);
246 ssusb->num_phys = of_count_phandle_with_args(node,
248 if (ssusb->num_phys > 0) {
249 ssusb->phys = devm_kcalloc(dev, ssusb->num_phys,
250 sizeof(*ssusb->phys), GFP_KERNEL);
251 if (!ssusb->phys)
254 ssusb->num_phys = 0;
257 for (i = 0; i < ssusb->num_phys; i++) {
258 ssusb->phys[i] = devm_of_phy_get_by_index(dev, node, i);
259 if (IS_ERR(ssusb->phys[i])) {
261 return PTR_ERR(ssusb->phys[i]);
265 ssusb->ippc_base = devm_platform_ioremap_resource_byname(pdev, "ippc");
266 if (IS_ERR(ssusb->ippc_base))
267 return PTR_ERR(ssusb->ippc_base);
269 ssusb->dr_mode = usb_get_dr_mode(dev);
270 if (ssusb->dr_mode == USB_DR_MODE_UNKNOWN)
271 ssusb->dr_mode = USB_DR_MODE_OTG;
273 if (ssusb->dr_mode == USB_DR_MODE_PERIPHERAL)
277 ret = ssusb_wakeup_of_property_parse(ssusb, node);
285 &ssusb->u3p_dis_msk);
293 if (ssusb->dr_mode == USB_DR_MODE_HOST)
303 otg_sx->edev = extcon_get_edev_by_phandle(ssusb->dev, 0);
305 dev_err(ssusb->dev, "couldn't get extcon device\n");
312 ssusb->dr_mode, otg_sx->is_u3_drd, ssusb->u3p_dis_msk,
322 struct ssusb_mtk *ssusb;
326 ssusb = devm_kzalloc(dev, sizeof(*ssusb), GFP_KERNEL);
327 if (!ssusb)
336 platform_set_drvdata(pdev, ssusb);
337 ssusb->dev = dev;
339 ret = get_ssusb_rscs(pdev, ssusb);
343 ssusb_debugfs_create_root(ssusb);
350 ret = ssusb_rscs_init(ssusb);
354 ssusb_ip_sw_reset(ssusb);
357 ssusb->dr_mode = USB_DR_MODE_HOST;
359 ssusb->dr_mode = USB_DR_MODE_PERIPHERAL;
362 ssusb->is_host = !(ssusb->dr_mode == USB_DR_MODE_PERIPHERAL);
364 switch (ssusb->dr_mode) {
366 ret = ssusb_gadget_init(ssusb);
373 ret = ssusb_host_init(ssusb, node);
380 ret = ssusb_gadget_init(ssusb);
386 ret = ssusb_host_init(ssusb, node);
392 ret = ssusb_otg_switch_init(ssusb);
399 dev_err(dev, "unsupported mode: %d\n", ssusb->dr_mode);
407 ssusb_host_exit(ssusb);
409 ssusb_gadget_exit(ssusb);
411 ssusb_rscs_exit(ssusb);
415 ssusb_debugfs_remove_root(ssusb);
422 struct ssusb_mtk *ssusb = platform_get_drvdata(pdev);
424 switch (ssusb->dr_mode) {
426 ssusb_gadget_exit(ssusb);
429 ssusb_host_exit(ssusb);
432 ssusb_otg_switch_exit(ssusb);
433 ssusb_gadget_exit(ssusb);
434 ssusb_host_exit(ssusb);
440 ssusb_rscs_exit(ssusb);
443 ssusb_debugfs_remove_root(ssusb);
454 struct ssusb_mtk *ssusb = dev_get_drvdata(dev);
459 if (!ssusb->is_host)
462 ssusb_host_disable(ssusb, true);
463 ssusb_phy_power_off(ssusb);
464 ssusb_clks_disable(ssusb);
465 ssusb_wakeup_set(ssusb, true);
472 struct ssusb_mtk *ssusb = dev_get_drvdata(dev);
477 if (!ssusb->is_host)
480 ssusb_wakeup_set(ssusb, false);
481 ret = ssusb_clks_enable(ssusb);
485 ret = ssusb_phy_power_on(ssusb);
489 ssusb_host_enable(ssusb);
494 ssusb_clks_disable(ssusb);