All of lore.kernel.org
 help / color / mirror / Atom feed
From: Adam Ford <aford173@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [RFC] usb: musb-new: omap2430: Enable DM_USB and OF support
Date: Tue, 31 Jul 2018 05:49:24 -0500	[thread overview]
Message-ID: <CAHCN7xK4U4CrBh4axRPcX5HxDE8jb2y4Dh=HZpbb977scZ=UCA@mail.gmail.com> (raw)
In-Reply-To: <CAHCN7xJMcC7bdvDiKc+qGiO4R99Lq0NzS2F7tbq66TexxzK_jw@mail.gmail.com>

On Tue, Jul 31, 2018 at 4:57 AM Adam Ford <aford173@gmail.com> wrote:
>
> On Sun, Jul 22, 2018 at 3:31 PM Lukasz Majewski <lukma@denx.de> wrote:
> >
> > Hi Adam,
> >
> > > On Sun, Jul 22, 2018 at 11:45 AM Adam Ford <aford173@gmail.com> wrote:
> > > >
> > > > With upcoming changes that require CONFIG_BLK, this broke
> > > > USB Mass Storage on the OMAP3 boards because if CONFIG_BLK is
> > > > enabled, it assumes that DM_USB is enabled, but it wasn't yet
> > > > available on omap3 and omap4 boards.
> > > >
> > > > This patch converts the OMAP2430 MUSB glue to support DM_USB and
> > > > extracts the necessary information based on the device tree.
> > > >
> > > > It's based on the ti-musb driver, but there are enough significant
> > > > differences in both the architecture and device tree entires between
> > > > am33xx and OMAP3/OMAP4, that I think it makes sense to continue to
> > > > keep the separate.
> > > >
> > >
> > > I forgot to mention that, I based this patch on top of an existing
> > > patch, that hasn't yet been reviewed which strips out a bunch of dead
> > > code
> > >  https://patchwork.ozlabs.org/patch/943813/
> > >
> > > I did it to make it easier for me to read.
> > >
> > > > This RFC has functional USB Host working, but it's hard coded to be
> > > > host or peripheral based on the config file.  Unfortunately,
> > > > USB Peripherals like fastboot, etc don't appear to be
> > > > working at all.  At least on omap3_logic (DM3730/OMAP35xx).
> > > > Any suggestions are appreciated in how to setup the MUSB in OTG mode
> > > > and get it to start USB in either host or gadget mode.

It appears as if USB gadget mode doesn't support DM yet per
doc/driver-model/usb-info.txt

I think I'll respin this a bit with some additional #ifdef's to check
for gadget and host mode with DM.

It would still be nice to get this working in DM_USB mode as much as
possible.  Hopefully the Gadget mode won't take long, but looking at
the date doc/driver-model/usb-info.txt, it may not happen soon.

> >
> > Has it been working from the outset? Is the old musb driver working
> > correctly with gadget infrastructure?
>
> Currently, the omap3_logic board selects the USB_MUSB_GADGET using the
> new MUSB driver.  Host is disabled, but when I do usb start, the
> device enumerates.
>
> When I enact fastboot usb 0, my host PC shows
>
> [307816.691237] usb 3-2: USB disconnect, device number 39
> [307866.180431] usb 3-2: new high-speed USB device number 41 using xhci_hcd
> [307866.328908] usb 3-2: New USB device found, idVendor=0451, idProduct=d022
> [307866.328912] usb 3-2: New USB device strings: Mfr=1, Product=2,
> SerialNumber=0
> [307866.328914] usb 3-2: Product: USB download gadget
> [307866.328916] usb 3-2: Manufacturer: TI
>
>
> >
> > > >
> > > > Unless an OTG adapter is connected with a USB device, the only
> > > > message I get when issing 'usb start' is
> > > >
> > > >         USB0:   Port not available.
> >
> > I assume that without your patches it works? It was not clear from your
> > commit message.
> >
>
> In gadget mode, yet, see above.
> > > >
> > > > Signed-off-by: Adam Ford <aford173@gmail.com>
> > > >
> > > > diff --git a/drivers/usb/musb-new/omap2430.c
> > > > b/drivers/usb/musb-new/omap2430.c index fd63c07789..8b56e1a42a
> > > > 100644 --- a/drivers/usb/musb-new/omap2430.c
> > > > +++ b/drivers/usb/musb-new/omap2430.c
> > > > @@ -9,14 +9,18 @@
> > > >   * This file is part of the Inventra Controller Driver for Linux.
> > > >   */
> > > >  #include <common.h>
> > > > +#include <dm.h>
> > > > +#include <dm/device-internal.h>
> > > > +#include <dm/lists.h>
> > > > +#include <linux/usb/otg.h>
> > > >  #include <asm/omap_common.h>
> > > >  #include <asm/omap_musb.h>
> > > >  #include <twl4030.h>
> > > >  #include <twl6030.h>
> > > >  #include "linux-compat.h"
> > > > -
> > > >  #include "musb_core.h"
> > > >  #include "omap2430.h"
> > > > +#include "musb_uboot.h"
> > > >
> > > >  static inline void omap2430_low_level_exit(struct musb *musb)
> > > >  {
> > > > @@ -43,6 +47,7 @@ static int omap2430_musb_init(struct musb *musb)
> > > >         u32 l;
> > > >         int status = 0;
> > > >         unsigned long int start;
> > > > +
> > > >         struct omap_musb_board_data *data =
> > > >                 (struct omap_musb_board_data *)musb->controller;
> > > >
> > > > @@ -129,3 +134,144 @@ const struct musb_platform_ops omap2430_ops =
> > > > { .enable         = omap2430_musb_enable,
> > > >         .disable        = omap2430_musb_disable,
> > > >  };
> > > > +
> > > > +#if defined(CONFIG_DM_USB)
> > > > +
> > > > +struct omap2430_musb_platdata {
> > > > +       void *base;
> > > > +       void *ctrl_mod_base;
> > > > +       struct musb_hdrc_platform_data plat;
> > > > +       struct musb_hdrc_config musb_config;
> > > > +       struct omap_musb_board_data otg_board_data;
> > > > +};
> > > > +
> > > > +static int omap2430_musb_ofdata_to_platdata(struct udevice *dev)
> > > > +{
> > > > +       struct omap2430_musb_platdata *platdata =
> > > > dev_get_platdata(dev);
> > > > +       const void *fdt = gd->fdt_blob;
> > > > +       int node = dev_of_offset(dev);
> > > > +
> > > > +       platdata->base = (void *)dev_read_addr_ptr(dev);
> > > > +
> > > > +       platdata->musb_config.multipoint = fdtdec_get_int(fdt, node,
> > > > +
> > > > "multipoint",
> > > > +                                                         -1);
> > > > +       if (platdata->musb_config.multipoint < 0) {
> > > > +               pr_err("MUSB multipoint DT entry missing\n");
> > > > +               return -ENOENT;
> > > > +       }
> > > > +
> > > > +       platdata->musb_config.dyn_fifo = 1;
> > > > +       platdata->musb_config.num_eps = fdtdec_get_int(fdt, node,
> > > > +                                                      "num-eps",
> > > > -1);
> > > > +       if (platdata->musb_config.num_eps < 0) {
> > > > +               pr_err("MUSB num-eps DT entry missing\n");
> > > > +               return -ENOENT;
> > > > +       }
> > > > +
> > > > +       platdata->musb_config.ram_bits = fdtdec_get_int(fdt, node,
> > > > +                                                       "ram-bits",
> > > > -1);
> > > > +       if (platdata->musb_config.ram_bits < 0) {
> > > > +               pr_err("MUSB ram-bits DT entry missing\n");
> > > > +               return -ENOENT;
> > > > +       }
> > > > +
> > > > +       platdata->plat.power = fdtdec_get_int(fdt, node,
> > > > +
> > > > "power", -1);
> > > > +       if (platdata->plat.power < 0) {
> > > > +               pr_err("MUSB power DT entry missing\n");
> > > > +               return -ENOENT;
> > > > +       }
> > > > +
> > > > +       platdata->otg_board_data.interface_type =
> > > > fdtdec_get_int(fdt, node,
> > > > +
> > > > "interface-type", -1);
> > > > +       if (platdata->otg_board_data.interface_type < 0) {
> > > > +               pr_err("MUSB interface-type DT entry missing\n");
> > > > +               return -ENOENT;
> > > > +       }
> > > > +
> > > > +#if 0 /* In a perfect world, mode would be set to OTG, mode 3 from
> > > > DT */
> > > > +       platdata->plat.mode = fdtdec_get_int(fdt, node,
> > > > +
> > > > "mode", -1);
> > > > +       if (platdata->plat.mode < 0) {
> > > > +               pr_err("MUSB mode DT entry missing\n");
> > > > +               return -ENOENT;
> > > > +       }
> > > > +#else /* MUSB_OTG, it doesn't work */
> > > > +#ifdef CONFIG_USB_MUSB_HOST /* Host seems to be the only option
> > > > that works */
> > > > +       platdata->plat.mode = MUSB_HOST;
> > > > +#else /* For that matter, MUSB_PERIPHERAL doesn't either */
> > > > +       platdata->plat.mode = MUSB_PERIPHERAL;
> > > > +#endif
> > > > +#endif
> > > > +       platdata->otg_board_data.dev = dev;
> > > > +       platdata->plat.config = &platdata->musb_config;
> > > > +       platdata->plat.platform_ops = &omap2430_ops;
> > > > +       platdata->plat.board_data = &platdata->otg_board_data;
> > > > +       return 0;
> > > > +}
> > > > +
> > > > +static int omap2430_musb_probe(struct udevice *dev)
> > > > +{
> > > > +#ifdef CONFIG_USB_MUSB_HOST
> > > > +       struct musb_host_data *host = dev_get_priv(dev);
> > > > +#endif
> > > > +       struct omap2430_musb_platdata *platdata =
> > > > dev_get_platdata(dev);
> > > > +       struct usb_bus_priv *priv = dev_get_uclass_priv(dev);
> > > > +       struct omap_musb_board_data *otg_board_data;
> > > > +       int ret;
> > > > +       void *base = dev_read_addr_ptr(dev);
> > > > +
> > > > +       priv->desc_before_addr = true;
> > > > +
> > > > +       otg_board_data = &platdata->otg_board_data;
> > > > +
> > > > +#ifdef CONFIG_USB_MUSB_HOST
> > > > +       host->host = musb_init_controller(&platdata->plat,
> > > > +                                         (struct device
> > > > *)otg_board_data,
> > > > +                                         platdata->base);
> > > > +       if (!host->host) {
> > > > +               return -EIO;
> > > > +       }
> > > > +
> > > > +       ret = musb_lowlevel_init(host);
> > > > +#else
> > > > +       ret = musb_register(&platdata->plat,
> > > > +                         (struct device *)otg_board_data,
> > > > +                         platdata->base);
> > > > +#endif
> > > > +       return ret;
> > > > +}
> > > > +
> > > > +static int omap2430_musb_remove(struct udevice *dev)
> > > > +{
> > > > +       struct musb_host_data *host = dev_get_priv(dev);
> > > > +
> > > > +       musb_stop(host->host);
> > > > +
> > > > +       return 0;
> > > > +}
> > > > +
> > > > +static const struct udevice_id omap2430_musb_ids[] = {
> > > > +       { .compatible = "ti,omap3-musb" },
> > > > +       { .compatible = "ti,omap4-musb" },
> > > > +       { }
> > > > +};
> > > > +
> > > > +U_BOOT_DRIVER(omap2430_musb) = {
> > > > +       .name   = "omap2430-musb",
> > > > +#ifdef CONFIG_USB_MUSB_HOST
> > > > +       .id             = UCLASS_USB,
> > > > +#else
> > > > +       .id             = UCLASS_USB_DEV_GENERIC,
> > > > +#endif
> > > > +       .of_match = omap2430_musb_ids,
> > > > +       .ofdata_to_platdata = omap2430_musb_ofdata_to_platdata,
> > > > +       .probe = omap2430_musb_probe,
> > > > +       .remove = omap2430_musb_remove,
> > > > +       .ops    = &musb_usb_ops,
> > > > +       .platdata_auto_alloc_size = sizeof(struct
> > > > omap2430_musb_platdata),
> > > > +       .priv_auto_alloc_size = sizeof(struct musb_host_data),
> > > > +};
> > > > +
> > > > +#endif /* CONFIG_DM_USB */
> > > > --
> > > > 2.17.1
> > > >
> >
> >
> >
> >
> > Best regards,
> >
> > Lukasz Majewski
> >
> > --
> >
> > DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
> > HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> > Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de

      reply	other threads:[~2018-07-31 10:49 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-22 16:45 [U-Boot] [RFC] usb: musb-new: omap2430: Enable DM_USB and OF support Adam Ford
2018-07-22 16:52 ` Adam Ford
2018-07-22 20:31   ` Lukasz Majewski
2018-07-31  9:57     ` Adam Ford
2018-07-31 10:49       ` Adam Ford [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAHCN7xK4U4CrBh4axRPcX5HxDE8jb2y4Dh=HZpbb977scZ=UCA@mail.gmail.com' \
    --to=aford173@gmail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.