Lines Matching refs:glue

54 static int mtk_musb_clks_get(struct mtk_glue *glue)
56 struct device *dev = glue->dev;
58 glue->main = devm_clk_get(dev, "main");
59 if (IS_ERR(glue->main)) {
61 return PTR_ERR(glue->main);
64 glue->mcu = devm_clk_get(dev, "mcu");
65 if (IS_ERR(glue->mcu)) {
67 return PTR_ERR(glue->mcu);
70 glue->univpll = devm_clk_get(dev, "univpll");
71 if (IS_ERR(glue->univpll)) {
73 return PTR_ERR(glue->univpll);
79 static int mtk_musb_clks_enable(struct mtk_glue *glue)
83 ret = clk_prepare_enable(glue->main);
85 dev_err(glue->dev, "failed to enable main clock\n");
89 ret = clk_prepare_enable(glue->mcu);
91 dev_err(glue->dev, "failed to enable mcu clock\n");
95 ret = clk_prepare_enable(glue->univpll);
97 dev_err(glue->dev, "failed to enable univpll clock\n");
104 clk_disable_unprepare(glue->mcu);
106 clk_disable_unprepare(glue->main);
111 static void mtk_musb_clks_disable(struct mtk_glue *glue)
113 clk_disable_unprepare(glue->univpll);
114 clk_disable_unprepare(glue->mcu);
115 clk_disable_unprepare(glue->main);
118 static int mtk_otg_switch_set(struct mtk_glue *glue, enum usb_role role)
120 struct musb *musb = glue->musb;
124 if (role == glue->role)
130 glue->phy_mode = PHY_MODE_USB_HOST;
132 if (glue->role == USB_ROLE_NONE)
133 phy_power_on(glue->phy);
141 glue->phy_mode = PHY_MODE_USB_DEVICE;
145 if (glue->role == USB_ROLE_NONE)
146 phy_power_on(glue->phy);
151 glue->phy_mode = PHY_MODE_USB_OTG;
155 if (glue->role != USB_ROLE_NONE)
156 phy_power_off(glue->phy);
160 dev_err(glue->dev, "Invalid State\n");
164 glue->role = new_role;
165 phy_set_mode(glue->phy, glue->phy_mode);
177 struct mtk_glue *glue = usb_role_switch_get_drvdata(sw);
179 return glue->role;
182 static int mtk_otg_switch_init(struct mtk_glue *glue)
188 role_sx_desc.fwnode = dev_fwnode(glue->dev);
189 role_sx_desc.driver_data = glue;
190 glue->role_sw = usb_role_switch_register(glue->dev, &role_sx_desc);
192 return PTR_ERR_OR_ZERO(glue->role_sw);
195 static void mtk_otg_switch_exit(struct mtk_glue *glue)
197 return usb_role_switch_unregister(glue->role_sw);
272 struct mtk_glue *glue = dev_get_drvdata(dev->parent);
290 dev_err(glue->dev, "Invalid mode request\n");
294 if (glue->phy_mode == new_mode)
298 dev_err(glue->dev, "Does not support changing modes\n");
302 mtk_otg_switch_set(glue, new_role);
309 struct mtk_glue *glue = dev_get_drvdata(dev->parent);
312 glue->musb = musb;
313 musb->phy = glue->phy;
314 musb->xceiv = glue->xceiv;
323 ret = mtk_otg_switch_init(glue);
328 ret = phy_init(glue->phy);
332 ret = phy_power_on(glue->phy);
336 phy_set_mode(glue->phy, glue->phy_mode);
347 phy_exit(glue->phy);
349 mtk_otg_switch_exit(glue);
387 struct mtk_glue *glue = dev_get_drvdata(dev->parent);
389 mtk_otg_switch_exit(glue);
390 phy_power_off(glue->phy);
391 phy_exit(glue->phy);
392 mtk_musb_clks_disable(glue);
453 struct mtk_glue *glue;
459 glue = devm_kzalloc(dev, sizeof(*glue), GFP_KERNEL);
460 if (!glue)
463 glue->dev = dev;
474 ret = mtk_musb_clks_get(glue);
489 glue->phy_mode = PHY_MODE_USB_HOST;
490 glue->role = USB_ROLE_HOST;
493 glue->phy_mode = PHY_MODE_USB_DEVICE;
494 glue->role = USB_ROLE_DEVICE;
497 glue->phy_mode = PHY_MODE_USB_OTG;
498 glue->role = USB_ROLE_NONE;
505 glue->phy = devm_of_phy_get_by_index(dev, np, 0);
506 if (IS_ERR(glue->phy)) {
508 PTR_ERR(glue->phy));
509 return PTR_ERR(glue->phy);
512 glue->usb_phy = usb_phy_generic_register();
513 if (IS_ERR(glue->usb_phy)) {
515 PTR_ERR(glue->usb_phy));
516 return PTR_ERR(glue->usb_phy);
519 glue->xceiv = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
520 if (IS_ERR(glue->xceiv)) {
521 ret = PTR_ERR(glue->xceiv);
526 platform_set_drvdata(pdev, glue);
530 ret = mtk_musb_clks_enable(glue);
541 glue->musb_pdev = platform_device_register_full(&pinfo);
542 if (IS_ERR(glue->musb_pdev)) {
543 ret = PTR_ERR(glue->musb_pdev);
551 mtk_musb_clks_disable(glue);
556 usb_phy_generic_unregister(glue->usb_phy);
562 struct mtk_glue *glue = platform_get_drvdata(pdev);
563 struct platform_device *usb_phy = glue->usb_phy;
565 platform_device_unregister(glue->musb_pdev);