[PATCH v3 04/11] usb: otg: nop: add support for multiple tranceiver

ABRAHAM, KISHON VIJAY kishon at ti.com
Thu Jul 19 19:23:37 EST 2012


Hi,

On Thu, Jul 19, 2012 at 11:11 AM, Ajay Kumar Gupta <ajay.gupta at ti.com> wrote:
> Currently we have one single nop transceiver support as same is
> defined as a global variable in drivers/usb/otg/nop-usb-xceiv.c.
> This need to be changed to support multiple otg controller each
> using nop transceiver on a platform such as am335x.
>
> Signed-off-by: Ajay Kumar Gupta <ajay.gupta at ti.com>
> ---
>  arch/arm/mach-omap2/board-omap3evm.c |    2 +-
>  drivers/usb/musb/am35x.c             |    4 ++--
>  drivers/usb/musb/blackfin.c          |    4 ++--
>  drivers/usb/musb/da8xx.c             |    4 ++--
>  drivers/usb/musb/davinci.c           |    6 +++---
>  drivers/usb/musb/musb_dsps.c         |   10 +++++-----
>  drivers/usb/musb/tusb6010.c          |    6 +++---
>  drivers/usb/otg/nop-usb-xceiv.c      |   20 ++++++++++++--------
>  include/linux/usb/otg.h              |    9 +++++----
>  9 files changed, 35 insertions(+), 30 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c
> index ef230a0..a3393bc 100644
> --- a/arch/arm/mach-omap2/board-omap3evm.c
> +++ b/arch/arm/mach-omap2/board-omap3evm.c
> @@ -704,7 +704,7 @@ static void __init omap3_evm_init(void)
>         omap_sdrc_init(mt46h32m32lf6_sdrc_params, NULL);
>
>         /* OMAP3EVM uses ISP1504 phy and so register nop transceiver */
> -       usb_nop_xceiv_register();
> +       usb_nop_xceiv_register(0);
>
>         if (get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2) {
>                 /* enable EHCI VBUS using GPIO22 */
> diff --git a/drivers/usb/musb/am35x.c b/drivers/usb/musb/am35x.c
> index 01203eb..eb6220f 100644
> --- a/drivers/usb/musb/am35x.c
> +++ b/drivers/usb/musb/am35x.c
> @@ -364,7 +364,7 @@ static int am35x_musb_init(struct musb *musb)
>         if (!rev)
>                 return -ENODEV;
>
> -       usb_nop_xceiv_register();
> +       usb_nop_xceiv_register(musb->id);
>         musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
>         if (IS_ERR_OR_NULL(musb->xceiv))
>                 return -ENODEV;
> @@ -408,7 +408,7 @@ static int am35x_musb_exit(struct musb *musb)
>                 data->set_phy_power(0);
>
>         usb_put_phy(musb->xceiv);
> -       usb_nop_xceiv_unregister();
> +       usb_nop_xceiv_unregister(musb->xceiv);
>
>         return 0;
>  }
> diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c
> index c848b82..03d081c 100644
> --- a/drivers/usb/musb/blackfin.c
> +++ b/drivers/usb/musb/blackfin.c
> @@ -415,7 +415,7 @@ static int bfin_musb_init(struct musb *musb)
>         }
>         gpio_direction_output(musb->config->gpio_vrsel, 0);
>
> -       usb_nop_xceiv_register();
> +       usb_nop_xceiv_register(musb->id);
>         musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
>         if (IS_ERR_OR_NULL(musb->xceiv)) {
>                 gpio_free(musb->config->gpio_vrsel);
> @@ -442,7 +442,7 @@ static int bfin_musb_exit(struct musb *musb)
>         gpio_free(musb->config->gpio_vrsel);
>
>         usb_put_phy(musb->xceiv);
> -       usb_nop_xceiv_unregister();
> +       usb_nop_xceiv_unregister(musb->xceiv);
>         return 0;
>  }
>
> diff --git a/drivers/usb/musb/da8xx.c b/drivers/usb/musb/da8xx.c
> index cebd9d7..3ce4a92 100644
> --- a/drivers/usb/musb/da8xx.c
> +++ b/drivers/usb/musb/da8xx.c
> @@ -425,7 +425,7 @@ static int da8xx_musb_init(struct musb *musb)
>         if (!rev)
>                 goto fail;
>
> -       usb_nop_xceiv_register();
> +       usb_nop_xceiv_register(musb->id);
>         musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
>         if (IS_ERR_OR_NULL(musb->xceiv))
>                 goto fail;
> @@ -460,7 +460,7 @@ static int da8xx_musb_exit(struct musb *musb)
>         phy_off();
>
>         usb_put_phy(musb->xceiv);
> -       usb_nop_xceiv_unregister();
> +       usb_nop_xceiv_unregister(musb->xceiv);
>
>         return 0;
>  }
> diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c
> index 3f094f2..d5156b3 100644
> --- a/drivers/usb/musb/davinci.c
> +++ b/drivers/usb/musb/davinci.c
> @@ -385,7 +385,7 @@ static int davinci_musb_init(struct musb *musb)
>         void __iomem    *tibase = musb->ctrl_base;
>         u32             revision;
>
> -       usb_nop_xceiv_register();
> +       usb_nop_xceiv_register(musb->id);
>         musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
>         if (IS_ERR_OR_NULL(musb->xceiv))
>                 goto unregister;
> @@ -447,7 +447,7 @@ static int davinci_musb_init(struct musb *musb)
>  fail:
>         usb_put_phy(musb->xceiv);
>  unregister:
> -       usb_nop_xceiv_unregister();
> +       usb_nop_xceiv_unregister(musb->xceiv);
>         return -ENODEV;
>  }
>
> @@ -496,7 +496,7 @@ static int davinci_musb_exit(struct musb *musb)
>         phy_off();
>
>         usb_put_phy(musb->xceiv);
> -       usb_nop_xceiv_unregister();
> +       usb_nop_xceiv_unregister(musb->xceiv);
>
>         return 0;
>  }
> diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
> index a2c8a06..9fcacff 100644
> --- a/drivers/usb/musb/musb_dsps.c
> +++ b/drivers/usb/musb/musb_dsps.c
> @@ -420,8 +420,8 @@ static int dsps_musb_init(struct musb *musb)
>         /* mentor core register starts at offset of 0x400 from musb base */
>         musb->mregs += wrp->musb_core_offset;
>
> -       /* NOP driver needs change if supporting dual instance */
> -       usb_nop_xceiv_register();
> +       /* Register NOP driver */
> +       usb_nop_xceiv_register(musb->id);
>         musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
>         if (IS_ERR_OR_NULL(musb->xceiv))
>                 return -ENODEV;
> @@ -456,7 +456,7 @@ static int dsps_musb_init(struct musb *musb)
>         return 0;
>  err0:
>         usb_put_phy(musb->xceiv);
> -       usb_nop_xceiv_unregister();
> +       usb_nop_xceiv_unregister(musb->xceiv);
>         return status;
>  }
>
> @@ -472,9 +472,9 @@ static int dsps_musb_exit(struct musb *musb)
>         /* Shutdown the on-chip PHY and its PLL. */
>         musb_dsps_phy_control(glue, musb->id, 0);
>
> -       /* NOP driver needs change if supporting dual instance */
> +       /* Unregister NOP driver */
>         usb_put_phy(musb->xceiv);
> -       usb_nop_xceiv_unregister();
> +       usb_nop_xceiv_unregister(musb->xceiv);
>
>         return 0;
>  }
> diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c
> index 64a0e95..6b23e55 100644
> --- a/drivers/usb/musb/tusb6010.c
> +++ b/drivers/usb/musb/tusb6010.c
> @@ -1078,7 +1078,7 @@ static int tusb_musb_init(struct musb *musb)
>         void __iomem            *sync = NULL;
>         int                     ret;
>
> -       usb_nop_xceiv_register();
> +       usb_nop_xceiv_register(musb->id);
>         musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
>         if (IS_ERR_OR_NULL(musb->xceiv))
>                 return -ENODEV;
> @@ -1132,7 +1132,7 @@ done:
>                         iounmap(sync);
>
>                 usb_put_phy(musb->xceiv);
> -               usb_nop_xceiv_unregister();
> +               usb_nop_xceiv_unregister(musb->xceiv);
>         }
>         return ret;
>  }
> @@ -1148,7 +1148,7 @@ static int tusb_musb_exit(struct musb *musb)
>         iounmap(musb->sync_va);
>
>         usb_put_phy(musb->xceiv);
> -       usb_nop_xceiv_unregister();
> +       usb_nop_xceiv_unregister(musb->xceiv);
>         return 0;
>  }
>
> diff --git a/drivers/usb/otg/nop-usb-xceiv.c b/drivers/usb/otg/nop-usb-xceiv.c
> index 803f958..2e5e889 100644
> --- a/drivers/usb/otg/nop-usb-xceiv.c
> +++ b/drivers/usb/otg/nop-usb-xceiv.c
> @@ -35,15 +35,14 @@
>  struct nop_usb_xceiv {
>         struct usb_phy          phy;
>         struct device           *dev;
> +       struct platform_device  *pd;
>  };
>
> -static struct platform_device *pd;
> -
> -void usb_nop_xceiv_register(void)
> +void usb_nop_xceiv_register(int id)
>  {
> -       if (pd)
> -               return;
> -       pd = platform_device_register_simple("nop_usb_xceiv", -1, NULL, 0);
> +       struct platform_device *pd;
> +
> +       pd = platform_device_register_simple("nop_usb_xceiv", id, NULL, 0);
>         if (!pd) {
>                 printk(KERN_ERR "Unable to register usb nop transceiver\n");
>                 return;
> @@ -51,10 +50,13 @@ void usb_nop_xceiv_register(void)
>  }
>  EXPORT_SYMBOL(usb_nop_xceiv_register);
>
> -void usb_nop_xceiv_unregister(void)
> +void usb_nop_xceiv_unregister(struct usb_phy *phy)
>  {
> +       struct nop_usb_xceiv *nop = container_of(phy,
> +                       struct nop_usb_xceiv, phy);
> +       struct platform_device *pd = nop->pd;
> +
>         platform_device_unregister(pd);
> -       pd = NULL;
>  }
>  EXPORT_SYMBOL(usb_nop_xceiv_unregister);
>
> @@ -107,11 +109,13 @@ static int __devinit nop_usb_xceiv_probe(struct platform_device *pdev)
>                 return -ENOMEM;
>         }
>
> +       nop->pd                 = pdev;
>         nop->dev                = &pdev->dev;
>         nop->phy.dev            = nop->dev;
>         nop->phy.label          = "nop-xceiv";
>         nop->phy.set_suspend    = nop_set_suspend;
>         nop->phy.state          = OTG_STATE_UNDEFINED;
> +       nop->phy.id             = pdev->id;
>
>         nop->phy.otg->phy               = &nop->phy;
>         nop->phy.otg->set_host          = nop_set_host;
> diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h
> index 4636d39..36cc791 100644
> --- a/include/linux/usb/otg.h
> +++ b/include/linux/usb/otg.h
> @@ -95,6 +95,7 @@ struct usb_phy {
>         struct device           *dev;
>         const char              *label;
>         unsigned int             flags;
> +       u8                      id;

Do we really need to have *id* in phy??
>
>         enum usb_phy_type       type;
>         enum usb_otg_state      state;
> @@ -137,14 +138,14 @@ extern void usb_remove_phy(struct usb_phy *);
>
>  #if defined(CONFIG_NOP_USB_XCEIV) || (defined(CONFIG_NOP_USB_XCEIV_MODULE) && defined(MODULE))
>  /* sometimes transceivers are accessed only through e.g. ULPI */
> -extern void usb_nop_xceiv_register(void);
> -extern void usb_nop_xceiv_unregister(void);
> +extern void usb_nop_xceiv_register(int id);
> +extern void usb_nop_xceiv_unregister(struct usb_phy *);
IMHO,  these declarations shouldn't be in usb/otg.h. It can be in a
header file specific to usb_nop?

Thanks
Kishon


More information about the devicetree-discuss mailing list