Lines Matching +full:line +full:- +full:name
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
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",
91 is detected and, respectively, released. The name string describes the
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;
170 musb and clk variables. The ``GFP_KERNEL`` flag (line 8) allows the
172 locking situation. The ``PLATFORM_DEVID_AUTO`` flag (line 12) allows
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");
219 (line 7). Next is passing on the device resources information, also privately
220 held at that point, through :c:func:`platform_device_add_resources` (line 9).
223 driver (line 16). Platform data will be discussed in
224 :ref:`musb-dev-platform-data`, but here we are looking at the
225 ``platform_ops`` function pointer (line 5) in ``musb_hdrc_platform_data``
226 structure (line 3). This function pointer allows the MUSB controller
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;
274 data. The next couple of instructions (line 12 and 14) are used as a
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);
333 MUSB controller hardware (line 5) and disable the clock (line 6),
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);
381 functions (line 7 and 24 respectively), which prevent the interrupt
384 Then the relevant interrupt registers are read (line 9 to 11):
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
399 Instruction on line 18 is another quirk specific to the JZ4740 USB
400 device controller, which will be discussed later in :ref:`musb-dev-quirks`.
403 the instruction on line 14 of the init function::
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
442 .name = "usb_phy_gen_xceiv",
449 .end = JZ4740_UDC_BASE_ADDR + 0x10000 - 1,
456 .name = "mc",
461 .name = "musb-jz4740",
462 .id = -1,
471 The ``jz4740_udc_xceiv_device`` platform device structure (line 2)
472 describes the UDC transceiver with a name and id number.
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
484 The ``jz4740_udc_resources`` resource structure (line 7) defines the UDC
487 The first array (line 9 to 11) defines the UDC registers base memory
491 define the registers memory addresses. The second array (line 14 to 17)
495 resources, and the name ``mc`` is in fact hard-coded in the MUSB core in
497 querying it by its name.
499 Finally, the ``jz4740_udc_device`` platform device structure (line 21)
502 The ``musb-jz4740`` name (line 22) defines the MUSB driver that is used
503 for this device; remember this is in fact the name that we used in the
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
508 we care for DMA related information here. The ``dma_mask`` field (line 25)
510 ``coherent_dma_mask`` (line 26) has the same purpose but for the
512 Then the resource field (line 29) is simply a pointer to the resource
513 structure defined before, while the ``num_resources`` field (line 28) keeps
521 .. code-block:: c
522 :emphasize-lines: 3,5,7-9,11
545 member (line 3) is set to 0 (equivalent to false) since the JZ4740 UDC
546 is not OTG compatible. Then ``num_eps`` (line 5) defines the number of USB
548 3 endpoints + endpoint 0. Next is ``ram_bits`` (line 7) which is the width
553 :ref:`musb-dev-quirks`. Last two fields (line 8 and 9) are also
557 :ref:`musb-dev-quirks`.
560 :c:type:`musb_hdrc_platform_data` structure (line 11): config is a pointer to
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;
607 Instruction on line 12 helps the MUSB controller driver to work around
612 endpoints configuration from the hardware, so we use line 12 instruction
614 hard-coded table that describes the endpoints configuration instead::
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);
671 Instruction on line 18 above is a way for the controller driver to work
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>`