Lines Matching +full:data +full:- +full:role

1 // SPDX-License-Identifier: GPL-2.0
11 #include <linux/dma-mapping.h>
15 #include <linux/usb/role.h>
50 enum usb_role role; member
56 struct device *dev = glue->dev; in mtk_musb_clks_get()
58 glue->main = devm_clk_get(dev, "main"); in mtk_musb_clks_get()
59 if (IS_ERR(glue->main)) { in mtk_musb_clks_get()
61 return PTR_ERR(glue->main); in mtk_musb_clks_get()
64 glue->mcu = devm_clk_get(dev, "mcu"); in mtk_musb_clks_get()
65 if (IS_ERR(glue->mcu)) { in mtk_musb_clks_get()
67 return PTR_ERR(glue->mcu); in mtk_musb_clks_get()
70 glue->univpll = devm_clk_get(dev, "univpll"); in mtk_musb_clks_get()
71 if (IS_ERR(glue->univpll)) { in mtk_musb_clks_get()
73 return PTR_ERR(glue->univpll); in mtk_musb_clks_get()
83 ret = clk_prepare_enable(glue->main); in mtk_musb_clks_enable()
85 dev_err(glue->dev, "failed to enable main clock\n"); in mtk_musb_clks_enable()
89 ret = clk_prepare_enable(glue->mcu); in mtk_musb_clks_enable()
91 dev_err(glue->dev, "failed to enable mcu clock\n"); in mtk_musb_clks_enable()
95 ret = clk_prepare_enable(glue->univpll); in mtk_musb_clks_enable()
97 dev_err(glue->dev, "failed to enable univpll clock\n"); in mtk_musb_clks_enable()
104 clk_disable_unprepare(glue->mcu); in mtk_musb_clks_enable()
106 clk_disable_unprepare(glue->main); in mtk_musb_clks_enable()
113 clk_disable_unprepare(glue->univpll); in mtk_musb_clks_disable()
114 clk_disable_unprepare(glue->mcu); in mtk_musb_clks_disable()
115 clk_disable_unprepare(glue->main); in mtk_musb_clks_disable()
118 static int mtk_otg_switch_set(struct mtk_glue *glue, enum usb_role role) in mtk_otg_switch_set() argument
120 struct musb *musb = glue->musb; in mtk_otg_switch_set()
121 u8 devctl = readb(musb->mregs + MUSB_DEVCTL); in mtk_otg_switch_set()
124 if (role == glue->role) in mtk_otg_switch_set()
127 switch (role) { in mtk_otg_switch_set()
129 musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE; in mtk_otg_switch_set()
130 glue->phy_mode = PHY_MODE_USB_HOST; in mtk_otg_switch_set()
132 if (glue->role == USB_ROLE_NONE) in mtk_otg_switch_set()
133 phy_power_on(glue->phy); in mtk_otg_switch_set()
136 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); in mtk_otg_switch_set()
140 musb->xceiv->otg->state = OTG_STATE_B_IDLE; in mtk_otg_switch_set()
141 glue->phy_mode = PHY_MODE_USB_DEVICE; in mtk_otg_switch_set()
144 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); in mtk_otg_switch_set()
145 if (glue->role == USB_ROLE_NONE) in mtk_otg_switch_set()
146 phy_power_on(glue->phy); in mtk_otg_switch_set()
151 glue->phy_mode = PHY_MODE_USB_OTG; in mtk_otg_switch_set()
154 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); in mtk_otg_switch_set()
155 if (glue->role != USB_ROLE_NONE) in mtk_otg_switch_set()
156 phy_power_off(glue->phy); in mtk_otg_switch_set()
160 dev_err(glue->dev, "Invalid State\n"); in mtk_otg_switch_set()
161 return -EINVAL; in mtk_otg_switch_set()
164 glue->role = new_role; in mtk_otg_switch_set()
165 phy_set_mode(glue->phy, glue->phy_mode); in mtk_otg_switch_set()
170 static int musb_usb_role_sx_set(struct usb_role_switch *sw, enum usb_role role) in musb_usb_role_sx_set() argument
172 return mtk_otg_switch_set(usb_role_switch_get_drvdata(sw), role); in musb_usb_role_sx_set()
179 return glue->role; in musb_usb_role_sx_get()
188 role_sx_desc.fwnode = dev_fwnode(glue->dev); in mtk_otg_switch_init()
190 glue->role_sw = usb_role_switch_register(glue->dev, &role_sx_desc); in mtk_otg_switch_init()
192 return PTR_ERR_OR_ZERO(glue->role_sw); in mtk_otg_switch_init()
197 return usb_role_switch_unregister(glue->role_sw); in mtk_otg_switch_exit()
206 spin_lock_irqsave(&musb->lock, flags); in generic_interrupt()
207 musb->int_usb = musb_clearb(musb->mregs, MUSB_INTRUSB); in generic_interrupt()
208 musb->int_rx = musb_clearw(musb->mregs, MUSB_INTRRX); in generic_interrupt()
209 musb->int_tx = musb_clearw(musb->mregs, MUSB_INTRTX); in generic_interrupt()
211 if ((musb->int_usb & MUSB_INTR_RESET) && !is_host_active(musb)) { in generic_interrupt()
213 musb_ep_select(musb->mregs, 0); in generic_interrupt()
214 musb_writeb(musb->mregs, MUSB_FADDR, 0); in generic_interrupt()
217 if (musb->int_usb || musb->int_tx || musb->int_rx) in generic_interrupt()
220 spin_unlock_irqrestore(&musb->lock, flags); in generic_interrupt()
231 l1_ints = musb_readl(musb->mregs, USB_L1INTS) & in mtk_musb_interrupt()
232 musb_readl(musb->mregs, USB_L1INTM); in mtk_musb_interrupt()
239 retval = dma_controller_irq(irq, musb->dma_controller); in mtk_musb_interrupt()
251 u8 data; in mtk_musb_clearb() local
254 data = musb_readb(addr, offset); in mtk_musb_clearb()
255 musb_writeb(addr, offset, data); in mtk_musb_clearb()
256 return data; in mtk_musb_clearb()
261 u16 data; in mtk_musb_clearw() local
264 data = musb_readw(addr, offset); in mtk_musb_clearw()
265 musb_writew(addr, offset, data); in mtk_musb_clearw()
266 return data; in mtk_musb_clearw()
271 struct device *dev = musb->controller; in mtk_musb_set_mode()
272 struct mtk_glue *glue = dev_get_drvdata(dev->parent); in mtk_musb_set_mode()
290 dev_err(glue->dev, "Invalid mode request\n"); in mtk_musb_set_mode()
291 return -EINVAL; in mtk_musb_set_mode()
294 if (glue->phy_mode == new_mode) in mtk_musb_set_mode()
297 if (musb->port_mode != MUSB_OTG) { in mtk_musb_set_mode()
298 dev_err(glue->dev, "Does not support changing modes\n"); in mtk_musb_set_mode()
299 return -EINVAL; in mtk_musb_set_mode()
308 struct device *dev = musb->controller; in mtk_musb_init()
309 struct mtk_glue *glue = dev_get_drvdata(dev->parent); in mtk_musb_init()
312 glue->musb = musb; in mtk_musb_init()
313 musb->phy = glue->phy; in mtk_musb_init()
314 musb->xceiv = glue->xceiv; in mtk_musb_init()
315 musb->is_host = false; in mtk_musb_init()
316 musb->isr = mtk_musb_interrupt; in mtk_musb_init()
319 musb_writew(musb->mregs, MUSB_TXTOGEN, MTK_TOGGLE_EN); in mtk_musb_init()
320 musb_writew(musb->mregs, MUSB_RXTOGEN, MTK_TOGGLE_EN); in mtk_musb_init()
322 if (musb->port_mode == MUSB_OTG) { in mtk_musb_init()
328 ret = phy_init(glue->phy); in mtk_musb_init()
332 ret = phy_power_on(glue->phy); in mtk_musb_init()
336 phy_set_mode(glue->phy, glue->phy_mode); in mtk_musb_init()
339 musb_writel(musb->mregs, MUSB_HSDMA_INTR, in mtk_musb_init()
342 musb_writel(musb->mregs, USB_L1INTM, TX_INT_STATUS | RX_INT_STATUS | in mtk_musb_init()
347 phy_exit(glue->phy); in mtk_musb_init()
355 struct musb *musb = qh->hw_ep->musb; in mtk_musb_get_toggle()
356 u8 epnum = qh->hw_ep->epnum; in mtk_musb_get_toggle()
359 toggle = musb_readw(musb->mregs, is_out ? MUSB_TXTOG : MUSB_RXTOG); in mtk_musb_get_toggle()
365 struct musb *musb = qh->hw_ep->musb; in mtk_musb_set_toggle()
366 u8 epnum = qh->hw_ep->epnum; in mtk_musb_set_toggle()
369 toggle = usb_gettoggle(urb->dev, qh->epnum, is_out); in mtk_musb_set_toggle()
372 value = musb_readw(musb->mregs, MUSB_TXTOG); in mtk_musb_set_toggle()
374 musb_writew(musb->mregs, MUSB_TXTOG, value); in mtk_musb_set_toggle()
376 value = musb_readw(musb->mregs, MUSB_RXTOG); in mtk_musb_set_toggle()
378 musb_writew(musb->mregs, MUSB_RXTOG, value); in mtk_musb_set_toggle()
386 struct device *dev = musb->controller; in mtk_musb_exit()
387 struct mtk_glue *glue = dev_get_drvdata(dev->parent); in mtk_musb_exit()
390 phy_power_off(glue->phy); in mtk_musb_exit()
391 phy_exit(glue->phy); in mtk_musb_exit()
445 .name = "musb-hdrc",
455 struct device *dev = &pdev->dev; in mtk_musb_probe()
456 struct device_node *np = dev->of_node; in mtk_musb_probe()
461 return -ENOMEM; in mtk_musb_probe()
463 glue->dev = dev; in mtk_musb_probe()
466 return -ENOMEM; in mtk_musb_probe()
478 pdata->config = &mtk_musb_hdrc_config; in mtk_musb_probe()
479 pdata->platform_ops = &mtk_musb_ops; in mtk_musb_probe()
480 pdata->mode = usb_get_dr_mode(dev); in mtk_musb_probe()
483 pdata->mode = USB_DR_MODE_HOST; in mtk_musb_probe()
485 pdata->mode = USB_DR_MODE_PERIPHERAL; in mtk_musb_probe()
487 switch (pdata->mode) { in mtk_musb_probe()
489 glue->phy_mode = PHY_MODE_USB_HOST; in mtk_musb_probe()
490 glue->role = USB_ROLE_HOST; in mtk_musb_probe()
493 glue->phy_mode = PHY_MODE_USB_DEVICE; in mtk_musb_probe()
494 glue->role = USB_ROLE_DEVICE; in mtk_musb_probe()
497 glue->phy_mode = PHY_MODE_USB_OTG; in mtk_musb_probe()
498 glue->role = USB_ROLE_NONE; in mtk_musb_probe()
501 dev_err(&pdev->dev, "Error 'dr_mode' property\n"); in mtk_musb_probe()
502 return -EINVAL; in mtk_musb_probe()
505 glue->phy = devm_of_phy_get_by_index(dev, np, 0); in mtk_musb_probe()
506 if (IS_ERR(glue->phy)) { in mtk_musb_probe()
508 PTR_ERR(glue->phy)); in mtk_musb_probe()
509 return PTR_ERR(glue->phy); in mtk_musb_probe()
512 glue->usb_phy = usb_phy_generic_register(); in mtk_musb_probe()
513 if (IS_ERR(glue->usb_phy)) { in mtk_musb_probe()
514 dev_err(dev, "fail to registering usb-phy %ld\n", in mtk_musb_probe()
515 PTR_ERR(glue->usb_phy)); in mtk_musb_probe()
516 return PTR_ERR(glue->usb_phy); in mtk_musb_probe()
519 glue->xceiv = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2); in mtk_musb_probe()
520 if (IS_ERR(glue->xceiv)) { in mtk_musb_probe()
521 dev_err(dev, "fail to getting usb-phy %d\n", ret); in mtk_musb_probe()
522 ret = PTR_ERR(glue->xceiv); in mtk_musb_probe()
536 pinfo.res = pdev->resource; in mtk_musb_probe()
537 pinfo.num_res = pdev->num_resources; in mtk_musb_probe()
538 pinfo.data = pdata; in mtk_musb_probe()
541 glue->musb_pdev = platform_device_register_full(&pinfo); in mtk_musb_probe()
542 if (IS_ERR(glue->musb_pdev)) { in mtk_musb_probe()
543 ret = PTR_ERR(glue->musb_pdev); in mtk_musb_probe()
556 usb_phy_generic_unregister(glue->usb_phy); in mtk_musb_probe()
563 struct platform_device *usb_phy = glue->usb_phy; in mtk_musb_remove()
565 platform_device_unregister(glue->musb_pdev); in mtk_musb_remove()
573 {.compatible = "mediatek,mtk-musb",},
583 .name = "musb-mtk",