Lines Matching +full:platform +full:- +full:data
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 ---------------------------------
59 | MUSB Platform Specific Driver |
60 | | <-- drivers/usb/musb/jz4740.c
62 ---------------------------------
64 ---------------------------------
66 ---------------------------------
68 As outlined above, the glue layer is actually the platform specific code
77 run-time.
86 .name = "musb-jz4740",
93 platform_device structure declared in ``arch/mips/jz4740/platform.c``. Note
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");
217 The first step is to pass the device data privately held by the glue
222 Finally comes passing on the platform specific data to the controller
223 driver (line 16). Platform data will be discussed in
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;
266 driver data of the MUSB controller hardware and pass it on to the MUSB
268 controller hardware responsible for sending/receiving the USB data.
272 Getting hold of the ``MUSB PHY`` driver data is done with ``usb_get_phy()``
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);
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:
419 Device Platform Data
422 In order to write an MUSB glue layer, you need to have some data
424 is called the platform data.
426 Platform data is specific to your hardware, though it may cover a broad
430 For instance, platform data for the JZ4740 SoC is found in
431 ``arch/mips/jz4740/platform.c``. In the ``platform.c`` file each device of the
434 Here is the part of ``arch/mips/jz4740/platform.c`` that covers the USB
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
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
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
517 With this quick overview of the UDC platform data at the ``arch/`` level now
518 done, let's get back to the MUSB glue layer specific platform data in
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`.
566 platform data information as we have seen in the probe function in
567 :ref:`musb-basics`.
569 .. _musb-dev-quirks:
574 Completing the platform data specific to your device, you may also need
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::
626 hardware), and maxpacket defines the maximum size of each data packet
629 USB data packets of 512 bytes at once (this is in fact a bulk in/out
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>`