Re: [PATCH] usb: phy: add R-Car R8A7779 USB phy driver.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On Tue, Sep 4, 2012 at 10:13 AM, Kuninori Morimoto
<kuninori.morimoto.gx@xxxxxxxxxxx> wrote:
> This patch adds Renesas R-Car USB phy driver.
> It supports R8A7779 chip at this point.
>
> Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@xxxxxxxxxxx>
> ---
>  drivers/usb/phy/Kconfig    |   11 ++++
>  drivers/usb/phy/Makefile   |    1 +
>  drivers/usb/phy/rcar-phy.c |  137 ++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 149 insertions(+)
>  create mode 100644 drivers/usb/phy/rcar-phy.c
>
> diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig
> index 2838adb..f55b6f6 100644
> --- a/drivers/usb/phy/Kconfig
> +++ b/drivers/usb/phy/Kconfig
> @@ -23,3 +23,14 @@ config MV_U3D_PHY
>         help
>           Enable this to support Marvell USB 3.0 phy controller for Marvell
>           SoC.
> +
> +config USB_RCAR_PHY
> +       tristate "Renesas R-Car USB phy support"
> +       depends on (USB || USB_GADGET) && ARCH_R8A7779
> +       help
> +         Say Y here to add support for the Renesas R-Car USB phy driver.

Just out of curiosity, which USB contoller will/is using this PHY?

> +         This chip is typically used as USB phy for USB host, gadget.
> +         This driver supports: R8A7779
> +
> +         To compile this driver as a module, choose M here: the
> +         module will be called rcar-phy.
> diff --git a/drivers/usb/phy/Makefile b/drivers/usb/phy/Makefile
> index cf38f08..9af83f0 100644
> --- a/drivers/usb/phy/Makefile
> +++ b/drivers/usb/phy/Makefile
> @@ -6,3 +6,4 @@ ccflags-$(CONFIG_USB_DEBUG) := -DDEBUG
>
>  obj-$(CONFIG_USB_ISP1301)              += isp1301.o
>  obj-$(CONFIG_MV_U3D_PHY)               += mv_u3d_phy.o
> +obj-$(CONFIG_USB_RCAR_PHY)             += rcar-phy.o
> diff --git a/drivers/usb/phy/rcar-phy.c b/drivers/usb/phy/rcar-phy.c
> new file mode 100644
> index 0000000..deec078
> --- /dev/null
> +++ b/drivers/usb/phy/rcar-phy.c
> @@ -0,0 +1,137 @@
> +/*
> + * Renesas R-Car USB phy driver
> + *
> + * Copyright (C) 2012 Renesas Solutions Corp.
> + * Kuninori Morimoto <kuninori.morimoto.gx@xxxxxxxxxxx>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + */
> +
> +#include <linux/delay.h>
> +#include <linux/io.h>
> +#include <linux/platform_device.h>
> +#include <linux/module.h>
> +
> +/* USBH common register */
> +#define USBPCTRL0      0x0800
> +#define USBPCTRL1      0x0804
> +#define USBST          0x0808
> +#define USBEH0         0x080C
> +#define USBOH0         0x081C
> +#define USBCTL0                0x0858
> +#define EIIBC1         0x0094
> +#define EIIBC2         0x009C
> +
> +#ifdef CONFIG_ARCH_SUPPORTS_BIG_ENDIAN
> +# define PHY_ENDIAN "BIG"
> +# define PHY_NO_SWAP 0x00000003
> +#else
> +# define PHY_ENDIAN "LITTLE"
> +# define PHY_NO_SWAP 0x00000000
> +#endif
> +
> +/*
> + * USB initial/install operation.
> + *
> + * This function setup USB phy.
> + * The used value and setting order came from
> + * [USB :: Initial setting] on datasheet.
> + */
> +static int rcar_phy_probe(struct platform_device *pdev)
> +{
> +       struct resource *res0, *res1;
> +       void __iomem *reg0, *reg1;
> +       int i, ret = 0;
> +       u32 val;
> +
> +       res0 = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +       res1 = platform_get_resource(pdev, IORESOURCE_MEM, 1);
> +       if (!res0 || !res1) {
> +               dev_err(&pdev->dev, "Not enough platform resources\n");
> +               return -ENODEV;
> +       }
> +
> +       reg0 = ioremap_nocache(res0->start, resource_size(res0));
> +       reg1 = ioremap_nocache(res1->start, resource_size(res1));

Instead use devm_ioremap_nocache?
> +       if (!reg0 || !reg1) {
> +               dev_err(&pdev->dev, "ioremap error.\n");
> +               ret = -ENOMEM;
> +               goto end;
> +       }
> +
> +       /*----------------------------------------*
> +        * USB phy start-up
> +        *----------------------------------------*/
> +
> +       /* (1) USB-PHY standby release */
> +       iowrite32(0x00000001, (reg0 + USBPCTRL1));

Can we have some macros to define the above constant (and for the
constants used below)?

> +
> +       /* (2) start USB-PHY internal PLL */
> +       iowrite32(0x00000003, (reg0 + USBPCTRL1));

No power management stuff added?? Dont we need to stop this PLL during suspend??
> +
> +       /* (3) USB module status check */
> +       for (i = 0; i < 1024; i++) {
> +               udelay(10);
> +               val = ioread32(reg0 + USBST);
> +               if (0xc0000000 == val)
> +                       goto usb_module_is_working;
> +       }
> +       dev_err(&pdev->dev, "USB module not ready\n");
> +       ret = -EIO;
> +       goto end;
> +
> +usb_module_is_working:
> +       /* (4) USB-PHY reset clear */
> +       iowrite32(0x00000007, (reg0 + USBPCTRL1));
> +
> +       /* set platform specific port settings */
> +       iowrite32(0x00000000, (reg0 + USBPCTRL0));
> +
> +       /*----------------------------------------*
> +        * EHCI IP Internal Buffer Setting
> +        *----------------------------------------*/
> +
> +       /* (1) EHCI IP internal buffer setting */
> +       iowrite32(0x00ff0040, (reg0 + EIIBC1));
> +       iowrite32(0x00ff0040, (reg1 + EIIBC1));
> +
> +       /* (2) EHCI IP internal buffer enable */
> +       iowrite32(0x00000001, (reg0 + EIIBC2));
> +       iowrite32(0x00000001, (reg1 + EIIBC2));
> +
> +       /*----------------------------------------*
> +        * Bus alignment settings
> +        *----------------------------------------*/
> +
> +       /* (1) EHCI bus alignment */
> +       iowrite32(PHY_NO_SWAP, (reg0 + USBEH0));
> +
> +       /* (1) OHCI bus alignment */
> +       iowrite32(PHY_NO_SWAP, (reg0 + USBOH0));
> +
> +       dev_info(&pdev->dev,
> +                "USB PHY alignment was initialized as %s endian no swap\n",
> +               PHY_ENDIAN);

dev_info is not needed.
> +end:
> +       if (reg0)
> +               iounmap(reg0);
> +       if (reg1)
> +               iounmap(reg1);
> +
> +       return 0;
> +}

I see you are doing one time initialization of the phy during probe.
But I think this phy will be pointless without the usb controller.
Instead how about using the library functions like
usb_add_phy/usb_get_phy/usb_phy_init?

Thanks
Kishon
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux