1 // SPDX-License-Identifier: GPL-2.0
3 * PolarFire SoC (MPFS) MUSB Glue Layer
5 * Copyright (c) 2020-2022 Microchip Corporation. All rights reserved.
6 * Based on {omap2430,tusb6010,ux500}.c
10 #include <linux/clk.h>
11 #include <linux/dma-mapping.h>
12 #include <linux/err.h>
14 #include <linux/kernel.h>
15 #include <linux/module.h>
17 #include <linux/platform_device.h>
18 #include <linux/usb/usb_phy_generic.h>
19 #include "musb_core.h"
22 #define MPFS_MUSB_MAX_EP_NUM 8
23 #define MPFS_MUSB_RAM_BITS 12
27 struct platform_device
*musb
;
28 struct platform_device
*phy
;
32 static struct musb_fifo_cfg mpfs_musb_mode_cfg
[] = {
33 { .hw_ep_num
= 1, .style
= FIFO_TX
, .maxpacket
= 512, },
34 { .hw_ep_num
= 1, .style
= FIFO_RX
, .maxpacket
= 512, },
35 { .hw_ep_num
= 2, .style
= FIFO_TX
, .maxpacket
= 512, },
36 { .hw_ep_num
= 2, .style
= FIFO_RX
, .maxpacket
= 512, },
37 { .hw_ep_num
= 3, .style
= FIFO_TX
, .maxpacket
= 512, },
38 { .hw_ep_num
= 3, .style
= FIFO_RX
, .maxpacket
= 512, },
39 { .hw_ep_num
= 4, .style
= FIFO_TX
, .maxpacket
= 1024, },
40 { .hw_ep_num
= 4, .style
= FIFO_RX
, .maxpacket
= 4096, },
43 static const struct musb_hdrc_config mpfs_musb_hdrc_config
= {
44 .fifo_cfg
= mpfs_musb_mode_cfg
,
45 .fifo_cfg_size
= ARRAY_SIZE(mpfs_musb_mode_cfg
),
48 .num_eps
= MPFS_MUSB_MAX_EP_NUM
,
49 .ram_bits
= MPFS_MUSB_RAM_BITS
,
52 static void mpfs_musb_set_vbus(struct musb
*musb
, int is_on
)
57 * HDRC controls CPEN, but beware current surges during device
58 * connect. They can trigger transient overcurrent conditions
59 * that must be ignored.
61 devctl
= musb_readb(musb
->mregs
, MUSB_DEVCTL
);
65 musb
->xceiv
->otg
->default_a
= 1;
66 musb
->xceiv
->otg
->state
= OTG_STATE_A_WAIT_VRISE
;
67 devctl
|= MUSB_DEVCTL_SESSION
;
73 * NOTE: skipping A_WAIT_VFALL -> A_IDLE and
74 * jumping right to B_IDLE...
76 musb
->xceiv
->otg
->default_a
= 0;
77 musb
->xceiv
->otg
->state
= OTG_STATE_B_IDLE
;
78 devctl
&= ~MUSB_DEVCTL_SESSION
;
83 musb_writeb(musb
->mregs
, MUSB_DEVCTL
, devctl
);
85 dev_dbg(musb
->controller
, "VBUS %s, devctl %02x\n",
86 usb_otg_state_string(musb
->xceiv
->otg
->state
),
87 musb_readb(musb
->mregs
, MUSB_DEVCTL
));
90 #define POLL_SECONDS 2
92 static void otg_timer(struct timer_list
*t
)
94 struct musb
*musb
= from_timer(musb
, t
, dev_timer
);
95 void __iomem
*mregs
= musb
->mregs
;
100 * We poll because PolarFire SoC won't expose several OTG-critical
101 * status change events (from the transceiver) otherwise.
103 devctl
= musb_readb(mregs
, MUSB_DEVCTL
);
104 dev_dbg(musb
->controller
, "Poll devctl %02x (%s)\n", devctl
,
105 usb_otg_state_string(musb
->xceiv
->otg
->state
));
107 spin_lock_irqsave(&musb
->lock
, flags
);
108 switch (musb
->xceiv
->otg
->state
) {
109 case OTG_STATE_A_WAIT_BCON
:
110 devctl
&= ~MUSB_DEVCTL_SESSION
;
111 musb_writeb(musb
->mregs
, MUSB_DEVCTL
, devctl
);
113 devctl
= musb_readb(musb
->mregs
, MUSB_DEVCTL
);
114 if (devctl
& MUSB_DEVCTL_BDEVICE
) {
115 musb
->xceiv
->otg
->state
= OTG_STATE_B_IDLE
;
117 mod_timer(&musb
->dev_timer
, jiffies
+ POLL_SECONDS
* HZ
);
119 musb
->xceiv
->otg
->state
= OTG_STATE_A_IDLE
;
123 case OTG_STATE_A_WAIT_VFALL
:
124 if (devctl
& MUSB_DEVCTL_VBUS
) {
125 mod_timer(&musb
->dev_timer
, jiffies
+ POLL_SECONDS
* HZ
);
128 musb
->xceiv
->otg
->state
= OTG_STATE_A_WAIT_VRISE
;
130 case OTG_STATE_B_IDLE
:
132 * There's no ID-changed IRQ, so we have no good way to tell
133 * when to switch to the A-Default state machine (by setting
134 * the DEVCTL.Session bit).
136 * Workaround: whenever we're in B_IDLE, try setting the
137 * session flag every few seconds. If it works, ID was
138 * grounded and we're now in the A-Default state machine.
140 * NOTE: setting the session flag is _supposed_ to trigger
141 * SRP but clearly it doesn't.
143 musb_writeb(mregs
, MUSB_DEVCTL
, devctl
| MUSB_DEVCTL_SESSION
);
144 devctl
= musb_readb(mregs
, MUSB_DEVCTL
);
145 if (devctl
& MUSB_DEVCTL_BDEVICE
)
146 mod_timer(&musb
->dev_timer
, jiffies
+ POLL_SECONDS
* HZ
);
148 musb
->xceiv
->otg
->state
= OTG_STATE_A_IDLE
;
153 spin_unlock_irqrestore(&musb
->lock
, flags
);
156 static void __maybe_unused
mpfs_musb_try_idle(struct musb
*musb
, unsigned long timeout
)
158 static unsigned long last_timer
;
161 timeout
= jiffies
+ msecs_to_jiffies(3);
163 /* Never idle if active, or when VBUS timeout is not set as host */
164 if (musb
->is_active
|| (musb
->a_wait_bcon
== 0 &&
165 musb
->xceiv
->otg
->state
== OTG_STATE_A_WAIT_BCON
)) {
166 dev_dbg(musb
->controller
, "%s active, deleting timer\n",
167 usb_otg_state_string(musb
->xceiv
->otg
->state
));
168 del_timer(&musb
->dev_timer
);
169 last_timer
= jiffies
;
173 if (time_after(last_timer
, timeout
) && timer_pending(&musb
->dev_timer
)) {
174 dev_dbg(musb
->controller
, "Longer idle timer already pending, ignoring...\n");
177 last_timer
= timeout
;
179 dev_dbg(musb
->controller
, "%s inactive, starting idle timer for %u ms\n",
180 usb_otg_state_string(musb
->xceiv
->otg
->state
),
181 jiffies_to_msecs(timeout
- jiffies
));
182 mod_timer(&musb
->dev_timer
, timeout
);
185 static irqreturn_t
mpfs_musb_interrupt(int irq
, void *__hci
)
188 irqreturn_t ret
= IRQ_NONE
;
189 struct musb
*musb
= __hci
;
191 spin_lock_irqsave(&musb
->lock
, flags
);
193 musb
->int_usb
= musb_readb(musb
->mregs
, MUSB_INTRUSB
);
194 musb
->int_tx
= musb_readw(musb
->mregs
, MUSB_INTRTX
);
195 musb
->int_rx
= musb_readw(musb
->mregs
, MUSB_INTRRX
);
197 if (musb
->int_usb
|| musb
->int_tx
|| musb
->int_rx
) {
198 musb_writeb(musb
->mregs
, MUSB_INTRUSB
, musb
->int_usb
);
199 musb_writew(musb
->mregs
, MUSB_INTRTX
, musb
->int_tx
);
200 musb_writew(musb
->mregs
, MUSB_INTRRX
, musb
->int_rx
);
201 ret
= musb_interrupt(musb
);
204 /* Poll for ID change */
205 if (musb
->xceiv
->otg
->state
== OTG_STATE_B_IDLE
)
206 mod_timer(&musb
->dev_timer
, jiffies
+ POLL_SECONDS
* HZ
);
208 spin_unlock_irqrestore(&musb
->lock
, flags
);
213 static int mpfs_musb_init(struct musb
*musb
)
215 struct device
*dev
= musb
->controller
;
217 musb
->xceiv
= devm_usb_get_phy(dev
, USB_PHY_TYPE_USB2
);
218 if (IS_ERR(musb
->xceiv
)) {
219 dev_err(dev
, "HS UDC: no transceiver configured\n");
220 return PTR_ERR(musb
->xceiv
);
223 timer_setup(&musb
->dev_timer
, otg_timer
, 0);
225 musb
->dyn_fifo
= true;
226 musb
->isr
= mpfs_musb_interrupt
;
228 musb_platform_set_vbus(musb
, 1);
233 static int mpfs_musb_exit(struct musb
*musb
)
235 del_timer_sync(&musb
->dev_timer
);
240 static const struct musb_platform_ops mpfs_ops
= {
241 .quirks
= MUSB_DMA_INVENTRA
,
242 .init
= mpfs_musb_init
,
243 .exit
= mpfs_musb_exit
,
245 #ifdef CONFIG_USB_INVENTRA_DMA
246 .dma_init
= musbhs_dma_controller_create
,
247 .dma_exit
= musbhs_dma_controller_destroy
,
249 #ifndef CONFIG_USB_MUSB_HOST
250 .try_idle
= mpfs_musb_try_idle
,
252 .set_vbus
= mpfs_musb_set_vbus
255 static int mpfs_probe(struct platform_device
*pdev
)
257 struct musb_hdrc_platform_data
*pdata
= dev_get_platdata(&pdev
->dev
);
258 struct mpfs_glue
*glue
;
259 struct platform_device
*musb_pdev
;
260 struct device
*dev
= &pdev
->dev
;
264 glue
= devm_kzalloc(dev
, sizeof(*glue
), GFP_KERNEL
);
268 musb_pdev
= platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO
);
270 dev_err(dev
, "failed to allocate musb device\n");
274 clk
= devm_clk_get(&pdev
->dev
, NULL
);
276 dev_err(&pdev
->dev
, "failed to get clock\n");
278 goto err_phy_release
;
281 ret
= clk_prepare_enable(clk
);
283 dev_err(&pdev
->dev
, "failed to enable clock\n");
284 goto err_phy_release
;
287 musb_pdev
->dev
.parent
= dev
;
288 musb_pdev
->dev
.coherent_dma_mask
= DMA_BIT_MASK(39);
289 musb_pdev
->dev
.dma_mask
= &musb_pdev
->dev
.coherent_dma_mask
;
290 device_set_of_node_from_dev(&musb_pdev
->dev
, dev
);
293 glue
->musb
= musb_pdev
;
296 pdata
= devm_kzalloc(dev
, sizeof(*pdata
), GFP_KERNEL
);
299 goto err_clk_disable
;
302 pdata
->config
= &mpfs_musb_hdrc_config
;
303 pdata
->platform_ops
= &mpfs_ops
;
305 pdata
->extvbus
= device_property_read_bool(dev
, "microchip,ext-vbus-drv");
307 pdata
->mode
= usb_get_dr_mode(dev
);
308 if (pdata
->mode
== USB_DR_MODE_UNKNOWN
) {
309 dev_info(dev
, "No dr_mode property found, defaulting to otg\n");
310 pdata
->mode
= USB_DR_MODE_OTG
;
313 glue
->phy
= usb_phy_generic_register();
314 if (IS_ERR(glue
->phy
)) {
315 dev_err(dev
, "failed to register usb-phy %ld\n",
317 ret
= PTR_ERR(glue
->phy
);
318 goto err_clk_disable
;
321 platform_set_drvdata(pdev
, glue
);
323 ret
= platform_device_add_resources(musb_pdev
, pdev
->resource
, pdev
->num_resources
);
325 dev_err(dev
, "failed to add resources\n");
326 goto err_clk_disable
;
329 ret
= platform_device_add_data(musb_pdev
, pdata
, sizeof(*pdata
));
331 dev_err(dev
, "failed to add platform_data\n");
332 goto err_clk_disable
;
335 ret
= platform_device_add(musb_pdev
);
337 dev_err(dev
, "failed to register musb device\n");
338 goto err_clk_disable
;
341 dev_info(&pdev
->dev
, "Registered MPFS MUSB driver\n");
345 clk_disable_unprepare(clk
);
348 usb_phy_generic_unregister(glue
->phy
);
349 platform_device_put(musb_pdev
);
353 static void mpfs_remove(struct platform_device
*pdev
)
355 struct mpfs_glue
*glue
= platform_get_drvdata(pdev
);
357 clk_disable_unprepare(glue
->clk
);
358 platform_device_unregister(glue
->musb
);
359 usb_phy_generic_unregister(pdev
);
363 static const struct of_device_id mpfs_id_table
[] = {
364 { .compatible
= "microchip,mpfs-musb" },
367 MODULE_DEVICE_TABLE(of
, mpfs_id_table
);
370 static struct platform_driver mpfs_musb_driver
= {
372 .remove
= mpfs_remove
,
375 .of_match_table
= of_match_ptr(mpfs_id_table
)
379 module_platform_driver(mpfs_musb_driver
);
381 MODULE_DESCRIPTION("PolarFire SoC MUSB Glue Layer");
382 MODULE_LICENSE("GPL");