Lines Matching +full:mpfs +full:- +full:musb

1 // SPDX-License-Identifier: GPL-2.0
3 * PolarFire SoC (MPFS) MUSB Glue Layer
5 * Copyright (c) 2020-2022 Microchip Corporation. All rights reserved.
11 #include <linux/dma-mapping.h>
27 struct platform_device *musb; member
56 struct musb *musb = __hci; in mpfs_musb_interrupt() local
58 spin_lock_irqsave(&musb->lock, flags); in mpfs_musb_interrupt()
60 musb->int_usb = musb_readb(musb->mregs, MUSB_INTRUSB); in mpfs_musb_interrupt()
61 musb->int_tx = musb_readw(musb->mregs, MUSB_INTRTX); in mpfs_musb_interrupt()
62 musb->int_rx = musb_readw(musb->mregs, MUSB_INTRRX); in mpfs_musb_interrupt()
64 if (musb->int_usb || musb->int_tx || musb->int_rx) { in mpfs_musb_interrupt()
65 musb_writeb(musb->mregs, MUSB_INTRUSB, musb->int_usb); in mpfs_musb_interrupt()
66 musb_writew(musb->mregs, MUSB_INTRTX, musb->int_tx); in mpfs_musb_interrupt()
67 musb_writew(musb->mregs, MUSB_INTRRX, musb->int_rx); in mpfs_musb_interrupt()
68 ret = musb_interrupt(musb); in mpfs_musb_interrupt()
71 spin_unlock_irqrestore(&musb->lock, flags); in mpfs_musb_interrupt()
76 static void mpfs_musb_set_vbus(struct musb *musb, int is_on) in mpfs_musb_set_vbus() argument
85 devctl = musb_readb(musb->mregs, MUSB_DEVCTL); in mpfs_musb_set_vbus()
88 musb->is_active = 1; in mpfs_musb_set_vbus()
89 musb->xceiv->otg->default_a = 1; in mpfs_musb_set_vbus()
90 musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE; in mpfs_musb_set_vbus()
92 MUSB_HST_MODE(musb); in mpfs_musb_set_vbus()
94 musb->is_active = 0; in mpfs_musb_set_vbus()
97 * NOTE: skipping A_WAIT_VFALL -> A_IDLE and in mpfs_musb_set_vbus()
100 musb->xceiv->otg->default_a = 0; in mpfs_musb_set_vbus()
101 musb->xceiv->otg->state = OTG_STATE_B_IDLE; in mpfs_musb_set_vbus()
104 MUSB_DEV_MODE(musb); in mpfs_musb_set_vbus()
107 musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); in mpfs_musb_set_vbus()
109 dev_dbg(musb->controller, "VBUS %s, devctl %02x\n", in mpfs_musb_set_vbus()
110 usb_otg_state_string(musb->xceiv->otg->state), in mpfs_musb_set_vbus()
111 musb_readb(musb->mregs, MUSB_DEVCTL)); in mpfs_musb_set_vbus()
114 static int mpfs_musb_init(struct musb *musb) in mpfs_musb_init() argument
116 struct device *dev = musb->controller; in mpfs_musb_init()
118 musb->xceiv = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2); in mpfs_musb_init()
119 if (IS_ERR(musb->xceiv)) { in mpfs_musb_init()
121 return PTR_ERR(musb->xceiv); in mpfs_musb_init()
124 musb->dyn_fifo = true; in mpfs_musb_init()
125 musb->isr = mpfs_musb_interrupt; in mpfs_musb_init()
127 musb_platform_set_vbus(musb, 1); in mpfs_musb_init()
145 struct musb_hdrc_platform_data *pdata = dev_get_platdata(&pdev->dev); in mpfs_probe()
148 struct device *dev = &pdev->dev; in mpfs_probe()
154 return -ENOMEM; in mpfs_probe()
156 musb_pdev = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO); in mpfs_probe()
158 dev_err(dev, "failed to allocate musb device\n"); in mpfs_probe()
159 return -ENOMEM; in mpfs_probe()
162 clk = devm_clk_get(&pdev->dev, NULL); in mpfs_probe()
164 dev_err(&pdev->dev, "failed to get clock\n"); in mpfs_probe()
171 dev_err(&pdev->dev, "failed to enable clock\n"); in mpfs_probe()
175 musb_pdev->dev.parent = dev; in mpfs_probe()
176 musb_pdev->dev.coherent_dma_mask = DMA_BIT_MASK(39); in mpfs_probe()
177 musb_pdev->dev.dma_mask = &musb_pdev->dev.coherent_dma_mask; in mpfs_probe()
178 device_set_of_node_from_dev(&musb_pdev->dev, dev); in mpfs_probe()
180 glue->dev = dev; in mpfs_probe()
181 glue->musb = musb_pdev; in mpfs_probe()
182 glue->clk = clk; in mpfs_probe()
186 ret = -ENOMEM; in mpfs_probe()
190 pdata->config = &mpfs_musb_hdrc_config; in mpfs_probe()
191 pdata->platform_ops = &mpfs_ops; in mpfs_probe()
193 pdata->mode = usb_get_dr_mode(dev); in mpfs_probe()
194 if (pdata->mode == USB_DR_MODE_UNKNOWN) { in mpfs_probe()
196 pdata->mode = USB_DR_MODE_OTG; in mpfs_probe()
199 glue->phy = usb_phy_generic_register(); in mpfs_probe()
200 if (IS_ERR(glue->phy)) { in mpfs_probe()
201 dev_err(dev, "failed to register usb-phy %ld\n", in mpfs_probe()
202 PTR_ERR(glue->phy)); in mpfs_probe()
203 ret = PTR_ERR(glue->phy); in mpfs_probe()
209 ret = platform_device_add_resources(musb_pdev, pdev->resource, pdev->num_resources); in mpfs_probe()
223 dev_err(dev, "failed to register musb device\n"); in mpfs_probe()
227 dev_info(&pdev->dev, "Registered MPFS MUSB driver\n"); in mpfs_probe()
234 usb_phy_generic_unregister(glue->phy); in mpfs_probe()
243 clk_disable_unprepare(glue->clk); in mpfs_remove()
244 platform_device_unregister(glue->musb); in mpfs_remove()
250 { .compatible = "microchip,mpfs-musb" },
260 .name = "mpfs-musb",
267 MODULE_DESCRIPTION("PolarFire SoC MUSB Glue Layer");