Lines Matching +full:2 +full:- +full:layered
15 Instead, these embedded UDC rely on the USB On-the-Go (OTG)
18 Dual-Role Controller (MUSB HDRC) found in the Mentor Graphics Inventra™
21 As a self-taught exercise I have written an MUSB glue layer for the
28 .. _musb-basics:
33 To get started on the topic, please read USB On-the-Go Basics (see
42 Linux USB stack is a layered architecture in which the MUSB controller
46 ------------------------
47 | | <------- drivers/usb/gadget
48 | Linux USB Core Stack | <------- drivers/usb/host
49 | | <------- drivers/usb/core
50 ------------------------
52 --------------------------
53 | | <------ drivers/usb/musb/musb_gadget.c
54 | MUSB Controller driver | <------ drivers/usb/musb/musb_host.c
55 | | <------ drivers/usb/musb/musb_core.c
56 --------------------------
58 ---------------------------------
60 | | <-- drivers/usb/musb/jz4740.c
62 ---------------------------------
64 ---------------------------------
66 ---------------------------------
77 run-time.
86 .name = "musb-jz4740",
123 .. code-block:: c
124 :emphasize-lines: 8,12,18
133 glue = devm_kzalloc(&pdev->dev, sizeof(*glue), GFP_KERNEL);
135 return -ENOMEM;
137 musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
139 dev_err(&pdev->dev, "failed to allocate musb device\n");
140 return -ENOMEM;
143 clk = devm_clk_get(&pdev->dev, "udc");
145 dev_err(&pdev->dev, "failed to get clock\n");
152 dev_err(&pdev->dev, "failed to enable clock\n");
156 musb->dev.parent = &pdev->dev;
158 glue->dev = &pdev->dev;
159 glue->musb = musb;
160 glue->clk = clk;
175 (line 18) the glue layer allocates the clock -- the ``devm_`` prefix
177 allocated clock resource data when the device is released -- and enable
184 .. code-block:: c
185 :emphasize-lines: 3,5,7,9,16
191 pdata->platform_ops = &jz4740_musb_ops;
195 ret = platform_device_add_resources(musb, pdev->resource,
196 pdev->num_resources);
198 dev_err(&pdev->dev, "failed to add resources\n");
204 dev_err(&pdev->dev, "failed to add platform_data\n");
224 :ref:`musb-dev-platform-data`, but here we are looking at the
239 between OTG and non-OTG modes, for instance.
244 .. code-block:: c
245 :emphasize-lines: 12,14
249 musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
250 if (!musb->xceiv) {
252 return -ENODEV;
258 musb->dyn_fifo = true;
260 musb->isr = jz4740_musb_interrupt;
276 will be discussed later in :ref:`musb-dev-quirks` and
277 :ref:`musb-handling-irqs`\ ::
281 usb_put_phy(musb->xceiv);
301 dev_err(&pdev->dev, "failed to register musb device\n");
319 .. code-block:: c
320 :emphasize-lines: 5,6
326 platform_device_unregister(glue->musb);
327 clk_disable_unprepare(glue->clk);
336 .. _musb-handling-irqs:
344 .. code-block:: c
345 :emphasize-lines: 7,9-11,14,24
353 spin_lock_irqsave(&musb->lock, flags);
355 musb->int_usb = musb_readb(musb->mregs, MUSB_INTRUSB);
356 musb->int_tx = musb_readw(musb->mregs, MUSB_INTRTX);
357 musb->int_rx = musb_readw(musb->mregs, MUSB_INTRRX);
364 musb->int_usb &= MUSB_INTR_SUSPEND | MUSB_INTR_RESUME |
367 if (musb->int_usb || musb->int_tx || musb->int_rx)
370 spin_unlock_irqrestore(&musb->lock, flags);
386 - ``MUSB_INTRUSB``: indicates which USB interrupts are currently active,
388 - ``MUSB_INTRTX``: indicates which of the interrupts for TX endpoints are
391 - ``MUSB_INTRRX``: indicates which of the interrupts for TX endpoints are
394 Note that :c:func:`musb_readb` is used to read 8-bit registers at most, while
395 :c:func:`musb_readw` allows us to read at most 16-bit registers. There are
400 device controller, which will be discussed later in :ref:`musb-dev-quirks`.
407 musb->isr = jz4740_musb_interrupt;
417 .. _musb-dev-platform-data:
437 .. code-block:: c
438 :emphasize-lines: 2,7,14-17,21,22,25,26,28,29
449 .end = JZ4740_UDC_BASE_ADDR + 0x10000 - 1,
461 .name = "musb-jz4740",
462 .id = -1,
471 The ``jz4740_udc_xceiv_device`` platform device structure (line 2)
475 specific name to be used for all transceivers that are either built-in
479 driver. The id field could be set to -1 (equivalent to
480 ``PLATFORM_DEVID_NONE``), -2 (equivalent to ``PLATFORM_DEVID_AUTO``) or
495 resources, and the name ``mc`` is in fact hard-coded in the MUSB core in
502 The ``musb-jz4740`` name (line 22) defines the MUSB driver that is used
504 ``jz4740_driver`` platform driver structure in :ref:`musb-basics`.
505 The id field (line 23) is set to -1 (equivalent to ``PLATFORM_DEVID_NONE``)
507 already set to allocate an automatic id in :ref:`musb-basics`. In the dev field
521 .. code-block:: c
522 :emphasize-lines: 3,5,7-9,11
553 :ref:`musb-dev-quirks`. Last two fields (line 8 and 9) are also
557 :ref:`musb-dev-quirks`.
567 :ref:`musb-basics`.
569 .. _musb-dev-quirks:
577 the result of an incomplete implementation of the USB On-the-Go
586 .. code-block:: c
587 :emphasize-lines: 12
591 musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
592 if (!musb->xceiv) {
594 return -ENODEV;
600 musb->dyn_fifo = true;
602 musb->isr = jz4740_musb_interrupt;
614 hard-coded table that describes the endpoints configuration instead::
619 { .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 64, },
630 endpoint), and endpoint 2 can be used to send data packets of 64 bytes
640 .. code-block:: c
641 :emphasize-lines: 18-19
649 spin_lock_irqsave(&musb->lock, flags);
651 musb->int_usb = musb_readb(musb->mregs, MUSB_INTRUSB);
652 musb->int_tx = musb_readw(musb->mregs, MUSB_INTRTX);
653 musb->int_rx = musb_readw(musb->mregs, MUSB_INTRRX);
660 musb->int_usb &= MUSB_INTR_SUSPEND | MUSB_INTR_RESUME |
663 if (musb->int_usb || musb->int_tx || musb->int_rx)
666 spin_unlock_irqrestore(&musb->lock, flags);
694 guidance to get started; should anything gets out of hand, the linux-usb
700 Many thanks to Lars-Peter Clausen and Maarten ter Huurne for answering
704 I would also like to thank the Qi-Hardware community at large for its
712 linux-usb Mailing List Archives: https://marc.info/?l=linux-usb
714 USB On-the-Go Basics:
715 https://www.maximintegrated.com/app-notes/index.mvp/id/1822
717 :ref:`Writing USB Device Drivers <writing-usb-driver>`