[PATCH 5/6] usb: phy: Add Renesas R-Car Gen2 USB PHY support for r8a7794

2014-07-25 Thread Ulrich Hecht
From: Shinobu Uehara 

Signed-off-by: Shinobu Uehara 
Cc: linux-usb@vger.kernel.org
---
 drivers/usb/phy/Kconfig | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig
index e253fa0..c1f55040 100644
--- a/drivers/usb/phy/Kconfig
+++ b/drivers/usb/phy/Kconfig
@@ -204,13 +204,13 @@ config USB_RCAR_PHY
 
 config USB_RCAR_GEN2_PHY
tristate "Renesas R-Car Gen2 USB PHY support"
-   depends on ARCH_R8A7790 || ARCH_R8A7791 || COMPILE_TEST
+   depends on ARCH_R8A7790 || ARCH_R8A7791 || ARCH_R8A7794 || COMPILE_TEST
select USB_PHY
help
  Say Y here to add support for the Renesas R-Car Gen2 USB PHY driver.
  It is typically used to control internal USB PHY for USBHS,
  and to configure shared USB channels 0 and 2.
- This driver supports R8A7790 and R8A7791.
+ This driver supports R8A7790, R8A7791 and R8A7794.
 
  To compile this driver as a module, choose M here: the
  module will be called phy-rcar-gen2-usb.
-- 
1.8.4.5

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


[PATCH v2 2/2] ARM: shmobile: lager: remove USBHS callbacks

2014-07-10 Thread Ulrich Hecht
Let the driver handle initialization and power control.

Signed-off-by: Ulrich Hecht 
---
 arch/arm/mach-shmobile/board-lager.c | 126 ---
 1 file changed, 13 insertions(+), 113 deletions(-)

diff --git a/arch/arm/mach-shmobile/board-lager.c 
b/arch/arm/mach-shmobile/board-lager.c
index b8b2b44..c2a14c7 100644
--- a/arch/arm/mach-shmobile/board-lager.c
+++ b/arch/arm/mach-shmobile/board-lager.c
@@ -420,117 +420,17 @@ static const struct resource usbhs_resources[] 
__initconst = {
DEFINE_RES_IRQ(gic_spi(107)),
 };
 
-struct usbhs_private {
-   struct renesas_usbhs_platform_info info;
-   struct usb_phy *phy;
-};
-
-#define usbhs_get_priv(pdev) \
-   container_of(renesas_usbhs_get_info(pdev), struct usbhs_private, info)
-
-static int usbhs_power_ctrl(struct platform_device *pdev,
-   void __iomem *base, int enable)
-{
-   struct usbhs_private *priv = usbhs_get_priv(pdev);
-
-   if (!priv->phy)
-   return -ENODEV;
-
-   if (enable) {
-   int retval = usb_phy_init(priv->phy);
-
-   if (!retval)
-   retval = usb_phy_set_suspend(priv->phy, 0);
-   return retval;
-   }
-
-   usb_phy_set_suspend(priv->phy, 1);
-   usb_phy_shutdown(priv->phy);
-   return 0;
-}
-
-static int usbhs_hardware_init(struct platform_device *pdev)
-{
-   struct usbhs_private *priv = usbhs_get_priv(pdev);
-   struct usb_phy *phy;
-   int ret;
-
-   /* USB0 Function - use PWEN as GPIO input to detect DIP Switch SW5
-* setting to avoid VBUS short circuit due to wrong cable.
-* PWEN should be pulled up high if USB Function is selected by SW5
-*/
-   gpio_request_one(RCAR_GP_PIN(5, 18), GPIOF_IN, NULL); /* USB0_PWEN */
-   if (!gpio_get_value(RCAR_GP_PIN(5, 18))) {
-   pr_warn("Error: USB Function not selected - check SW5 + SW6\n");
-   ret = -ENOTSUPP;
-   goto error;
-   }
-
-   phy = usb_get_phy_dev(&pdev->dev, 0);
-   if (IS_ERR(phy)) {
-   ret = PTR_ERR(phy);
-   goto error;
-   }
-
-   priv->phy = phy;
-   return 0;
- error:
-   gpio_free(RCAR_GP_PIN(5, 18));
-   return ret;
-}
-
-static int usbhs_hardware_exit(struct platform_device *pdev)
-{
-   struct usbhs_private *priv = usbhs_get_priv(pdev);
-
-   if (!priv->phy)
-   return 0;
-
-   usb_put_phy(priv->phy);
-   priv->phy = NULL;
-
-   gpio_free(RCAR_GP_PIN(5, 18));
-   return 0;
-}
-
-static int usbhs_get_id(struct platform_device *pdev)
-{
-   return USBHS_GADGET;
-}
-
-static u32 lager_usbhs_pipe_type[] = {
-   USB_ENDPOINT_XFER_CONTROL,
-   USB_ENDPOINT_XFER_ISOC,
-   USB_ENDPOINT_XFER_ISOC,
-   USB_ENDPOINT_XFER_BULK,
-   USB_ENDPOINT_XFER_BULK,
-   USB_ENDPOINT_XFER_BULK,
-   USB_ENDPOINT_XFER_INT,
-   USB_ENDPOINT_XFER_INT,
-   USB_ENDPOINT_XFER_INT,
-   USB_ENDPOINT_XFER_BULK,
-   USB_ENDPOINT_XFER_BULK,
-   USB_ENDPOINT_XFER_BULK,
-   USB_ENDPOINT_XFER_BULK,
-   USB_ENDPOINT_XFER_BULK,
-   USB_ENDPOINT_XFER_BULK,
-   USB_ENDPOINT_XFER_BULK,
-};
-
-static struct usbhs_private usbhs_priv __initdata = {
-   .info = {
-   .platform_callback = {
-   .power_ctrl = usbhs_power_ctrl,
-   .hardware_init  = usbhs_hardware_init,
-   .hardware_exit  = usbhs_hardware_exit,
-   .get_id = usbhs_get_id,
-   },
-   .driver_param = {
-   .buswait_bwait  = 4,
-   .pipe_type = lager_usbhs_pipe_type,
-   .pipe_size = ARRAY_SIZE(lager_usbhs_pipe_type),
-   },
-   }
+static struct renesas_usbhs_platform_info usbhs_info __initdata = {
+   .driver_param = {
+   .buswait_bwait  = 4,
+   .type = USBHS_TYPE_R8A7790,
+   /* USB0 Function - use PWEN as GPIO input to detect DIP
+* Switch SW5 setting to avoid VBUS short circuit due to
+* wrong cable.  PWEN should be pulled up high if USB
+* Function is selected by SW5.
+*/
+   .enable_gpio = RCAR_GP_PIN(5, 18),
+   },
 };
 
 static void __init lager_register_usbhs(void)
@@ -540,8 +440,8 @@ static void __init lager_register_usbhs(void)
  "renesas_usbhs", -1,
  usbhs_resources,
  ARRAY_SIZE(usbhs_resources),
- &usbhs_priv.info,
- sizeof(usbhs_priv.info));
+ &usbhs_info,
+ sizeof(usbhs_inf

[PATCH v2 1/2] usb: renesas_usbhs: add R-Car Gen. 2 init and power control

2014-07-10 Thread Ulrich Hecht
In preparation for DT conversion to reduce reliance on platform device
callbacks.

Signed-off-by: Ulrich Hecht 
---
 drivers/usb/renesas_usbhs/Makefile |  2 +-
 drivers/usb/renesas_usbhs/common.c | 66 ++---
 drivers/usb/renesas_usbhs/common.h |  2 +
 drivers/usb/renesas_usbhs/rcar2.c  | 76 ++
 drivers/usb/renesas_usbhs/rcar2.h  |  4 ++
 include/linux/usb/renesas_usbhs.h  |  6 +++
 6 files changed, 150 insertions(+), 6 deletions(-)
 create mode 100644 drivers/usb/renesas_usbhs/rcar2.c
 create mode 100644 drivers/usb/renesas_usbhs/rcar2.h

diff --git a/drivers/usb/renesas_usbhs/Makefile 
b/drivers/usb/renesas_usbhs/Makefile
index bc8aef4..9e47f47 100644
--- a/drivers/usb/renesas_usbhs/Makefile
+++ b/drivers/usb/renesas_usbhs/Makefile
@@ -4,7 +4,7 @@
 
 obj-$(CONFIG_USB_RENESAS_USBHS)+= renesas_usbhs.o
 
-renesas_usbhs-y:= common.o mod.o pipe.o fifo.o
+renesas_usbhs-y:= common.o mod.o pipe.o fifo.o rcar2.o
 
 ifneq ($(CONFIG_USB_RENESAS_USBHS_HCD),)
renesas_usbhs-y += mod_host.o
diff --git a/drivers/usb/renesas_usbhs/common.c 
b/drivers/usb/renesas_usbhs/common.c
index 17267b0..1b9bf8d 100644
--- a/drivers/usb/renesas_usbhs/common.c
+++ b/drivers/usb/renesas_usbhs/common.c
@@ -15,12 +15,14 @@
  *
  */
 #include 
+#include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include "common.h"
+#include "rcar2.h"
 
 /*
  * image of renesas_usbhs
@@ -284,6 +286,8 @@ static void usbhsc_set_buswait(struct usbhs_priv *priv)
 /*
  * platform default param
  */
+
+/* commonly used on old SH-Mobile SoCs */
 static u32 usbhsc_default_pipe_type[] = {
USB_ENDPOINT_XFER_CONTROL,
USB_ENDPOINT_XFER_ISOC,
@@ -297,6 +301,26 @@ static u32 usbhsc_default_pipe_type[] = {
USB_ENDPOINT_XFER_INT,
 };
 
+/* commonly used on newer SH-Mobile and R-Car SoCs */
+static u32 usbhsc_new_pipe_type[] = {
+   USB_ENDPOINT_XFER_CONTROL,
+   USB_ENDPOINT_XFER_ISOC,
+   USB_ENDPOINT_XFER_ISOC,
+   USB_ENDPOINT_XFER_BULK,
+   USB_ENDPOINT_XFER_BULK,
+   USB_ENDPOINT_XFER_BULK,
+   USB_ENDPOINT_XFER_INT,
+   USB_ENDPOINT_XFER_INT,
+   USB_ENDPOINT_XFER_INT,
+   USB_ENDPOINT_XFER_BULK,
+   USB_ENDPOINT_XFER_BULK,
+   USB_ENDPOINT_XFER_BULK,
+   USB_ENDPOINT_XFER_BULK,
+   USB_ENDPOINT_XFER_BULK,
+   USB_ENDPOINT_XFER_BULK,
+   USB_ENDPOINT_XFER_BULK,
+};
+
 /*
  * power control
  */
@@ -423,8 +447,7 @@ static int usbhs_probe(struct platform_device *pdev)
int ret;
 
/* check platform information */
-   if (!info ||
-   !info->platform_callback.get_id) {
+   if (!info) {
dev_err(&pdev->dev, "no platform information\n");
return -EINVAL;
}
@@ -451,13 +474,32 @@ static int usbhs_probe(struct platform_device *pdev)
/*
 * care platform info
 */
-   memcpy(&priv->pfunc,
-  &info->platform_callback,
-  sizeof(struct renesas_usbhs_platform_callback));
+
memcpy(&priv->dparam,
   &info->driver_param,
   sizeof(struct renesas_usbhs_driver_param));
 
+   switch (priv->dparam.type) {
+   case USBHS_TYPE_R8A7790:
+   case USBHS_TYPE_R8A7791:
+   priv->pfunc = usbhs_rcar2_ops;
+   if (!priv->dparam.pipe_type) {
+   priv->dparam.pipe_type = usbhsc_new_pipe_type;
+   priv->dparam.pipe_size =
+   ARRAY_SIZE(usbhsc_new_pipe_type);
+   }
+   break;
+   default:
+   if (!info->platform_callback.get_id) {
+   dev_err(&pdev->dev, "no platform callbacks");
+   return -EINVAL;
+   }
+   memcpy(&priv->pfunc,
+  &info->platform_callback,
+  sizeof(struct renesas_usbhs_platform_callback));
+   break;
+   }
+
/* set driver callback functions for platform */
dfunc   = &info->driver_callback;
dfunc->notify_hotplug   = usbhsc_drvcllbck_notify_hotplug;
@@ -507,6 +549,20 @@ static int usbhs_probe(struct platform_device *pdev)
 */
usbhs_sys_clock_ctrl(priv, 0);
 
+   /* check GPIO determining if USB function should be enabled */
+   if (priv->dparam.enable_gpio) {
+   gpio_request_one(priv->dparam.enable_gpio, GPIOF_IN, NULL);
+   ret = !gpio_get_value(priv->dparam.enable_gpio);
+   gpio_free(priv->dparam.enable_gpio);
+   

[PATCH v2 0/2] ARM: shmobile: lager: USBHS callback elimination

2014-07-10 Thread Ulrich Hecht
Changes in v2:
- move phy handle to struct usbhs_priv
- add new default pipe type to driver
- remove pipe type from Lager board code

Ulrich Hecht (2):
  usb: renesas_usbhs: add R-Car Gen. 2 init and power control
  ARM: shmobile: lager: remove USBHS callbacks

 arch/arm/mach-shmobile/board-lager.c | 126 ---
 drivers/usb/renesas_usbhs/Makefile   |   2 +-
 drivers/usb/renesas_usbhs/common.c   |  66 --
 drivers/usb/renesas_usbhs/common.h   |   2 +
 drivers/usb/renesas_usbhs/rcar2.c|  76 +
 drivers/usb/renesas_usbhs/rcar2.h|   4 ++
 include/linux/usb/renesas_usbhs.h|   6 ++
 7 files changed, 163 insertions(+), 119 deletions(-)
 create mode 100644 drivers/usb/renesas_usbhs/rcar2.c
 create mode 100644 drivers/usb/renesas_usbhs/rcar2.h

-- 
1.8.4.5

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


Re: [PATCH 1/2] usb: renesas_usbhs: add R-Car Gen. 2 init and power control

2014-07-09 Thread Ulrich Hecht
On Wed, Jul 9, 2014 at 2:08 AM, Kuninori Morimoto
 wrote:
>
> Hi Ulrich
>
> Thank you for your patch

Thank you for your review.

>> @@ -186,6 +192,8 @@ struct renesas_usbhs_platform_info {
>>* driver use these param for some register
>>*/
>>   struct renesas_usbhs_driver_param   driver_param;
>> +
>> + struct usb_phy *phy;
>>  };
>
> Using renesas_usbhs_platform_info for *phy is not good idea from my point of 
> view.
> Because its memory is located on platform side.
> (this is the reason why usbhs_probe() using memcpy() for getting info->xxx)
>
> I guess struct usbhs_priv is good place,
> and you can use usbhs_pdev_to_priv() for this purpose ?

Yes, that seems more natural anyway.

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


[PATCH 1/2] usb: renesas_usbhs: add R-Car Gen. 2 init and power control

2014-07-08 Thread Ulrich Hecht
In preparation for DT conversion to reduce reliance on platform device
callbacks.

Signed-off-by: Ulrich Hecht 
---
 drivers/usb/renesas_usbhs/Makefile |  2 +-
 drivers/usb/renesas_usbhs/common.c | 39 ---
 drivers/usb/renesas_usbhs/rcar2.c  | 76 ++
 drivers/usb/renesas_usbhs/rcar2.h  |  4 ++
 include/linux/usb/renesas_usbhs.h  |  8 
 5 files changed, 123 insertions(+), 6 deletions(-)
 create mode 100644 drivers/usb/renesas_usbhs/rcar2.c
 create mode 100644 drivers/usb/renesas_usbhs/rcar2.h

diff --git a/drivers/usb/renesas_usbhs/Makefile 
b/drivers/usb/renesas_usbhs/Makefile
index bc8aef4..9e47f47 100644
--- a/drivers/usb/renesas_usbhs/Makefile
+++ b/drivers/usb/renesas_usbhs/Makefile
@@ -4,7 +4,7 @@
 
 obj-$(CONFIG_USB_RENESAS_USBHS)+= renesas_usbhs.o
 
-renesas_usbhs-y:= common.o mod.o pipe.o fifo.o
+renesas_usbhs-y:= common.o mod.o pipe.o fifo.o rcar2.o
 
 ifneq ($(CONFIG_USB_RENESAS_USBHS_HCD),)
renesas_usbhs-y += mod_host.o
diff --git a/drivers/usb/renesas_usbhs/common.c 
b/drivers/usb/renesas_usbhs/common.c
index 17267b0..619a3bb 100644
--- a/drivers/usb/renesas_usbhs/common.c
+++ b/drivers/usb/renesas_usbhs/common.c
@@ -15,12 +15,14 @@
  *
  */
 #include 
+#include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include "common.h"
+#include "rcar2.h"
 
 /*
  * image of renesas_usbhs
@@ -423,8 +425,7 @@ static int usbhs_probe(struct platform_device *pdev)
int ret;
 
/* check platform information */
-   if (!info ||
-   !info->platform_callback.get_id) {
+   if (!info) {
dev_err(&pdev->dev, "no platform information\n");
return -EINVAL;
}
@@ -451,13 +452,27 @@ static int usbhs_probe(struct platform_device *pdev)
/*
 * care platform info
 */
-   memcpy(&priv->pfunc,
-  &info->platform_callback,
-  sizeof(struct renesas_usbhs_platform_callback));
+
memcpy(&priv->dparam,
   &info->driver_param,
   sizeof(struct renesas_usbhs_driver_param));
 
+   switch (priv->dparam.type) {
+   case USBHS_TYPE_R8A7790:
+   case USBHS_TYPE_R8A7791:
+   priv->pfunc = usbhs_rcar2_ops;
+   break;
+   default:
+   if (!info->platform_callback.get_id) {
+   dev_err(&pdev->dev, "no platform callbacks");
+   return -EINVAL;
+   }
+   memcpy(&priv->pfunc,
+  &info->platform_callback,
+  sizeof(struct renesas_usbhs_platform_callback));
+   break;
+   }
+
/* set driver callback functions for platform */
dfunc   = &info->driver_callback;
dfunc->notify_hotplug   = usbhsc_drvcllbck_notify_hotplug;
@@ -507,6 +522,20 @@ static int usbhs_probe(struct platform_device *pdev)
 */
usbhs_sys_clock_ctrl(priv, 0);
 
+   /* check GPIO determining if USB function should be enabled */
+   if (priv->dparam.enable_gpio) {
+   gpio_request_one(priv->dparam.enable_gpio, GPIOF_IN, NULL);
+   ret = !gpio_get_value(priv->dparam.enable_gpio);
+   gpio_free(priv->dparam.enable_gpio);
+   if (ret) {
+   dev_warn(&pdev->dev,
+"USB function not selected (GPIO %d)\n",
+priv->dparam.enable_gpio);
+   ret = -ENOTSUPP;
+   goto probe_end_mod_exit;
+   }
+   }
+
/*
 * platform call
 *
diff --git a/drivers/usb/renesas_usbhs/rcar2.c 
b/drivers/usb/renesas_usbhs/rcar2.c
new file mode 100644
index 000..069704c
--- /dev/null
+++ b/drivers/usb/renesas_usbhs/rcar2.c
@@ -0,0 +1,76 @@
+/*
+ * Renesas USB driver R-Car Gen. 2 initialization and power control
+ *
+ * Copyright (C) 2014 Ulrich Hecht
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include "common.h"
+
+static int usbhs_rcar2_hardware_init(struct platform_device *pdev)
+{
+   struct renesas_usbhs_platform_info *info = dev_get_platdata(&pdev->dev);
+   struct usb_phy *phy;
+
+   phy = usb_get_phy_dev(&pdev->dev, 0);
+   if (IS_ERR(phy))
+   return PTR_ERR(phy);
+
+   info->phy = phy;
+   return 0;
+}
+
+static int usbhs_rcar2_hardware_exit(struct platform_device *pdev)
+{
+   struct

[PATCH 2/2] ARM: shmobile: lager: remove USBHS callbacks

2014-07-08 Thread Ulrich Hecht
Let the driver handle initialization and power control.

Signed-off-by: Ulrich Hecht 
---
 arch/arm/mach-shmobile/board-lager.c | 109 +--
 1 file changed, 15 insertions(+), 94 deletions(-)

diff --git a/arch/arm/mach-shmobile/board-lager.c 
b/arch/arm/mach-shmobile/board-lager.c
index b8b2b44..0138bc5 100644
--- a/arch/arm/mach-shmobile/board-lager.c
+++ b/arch/arm/mach-shmobile/board-lager.c
@@ -420,84 +420,6 @@ static const struct resource usbhs_resources[] __initconst 
= {
DEFINE_RES_IRQ(gic_spi(107)),
 };
 
-struct usbhs_private {
-   struct renesas_usbhs_platform_info info;
-   struct usb_phy *phy;
-};
-
-#define usbhs_get_priv(pdev) \
-   container_of(renesas_usbhs_get_info(pdev), struct usbhs_private, info)
-
-static int usbhs_power_ctrl(struct platform_device *pdev,
-   void __iomem *base, int enable)
-{
-   struct usbhs_private *priv = usbhs_get_priv(pdev);
-
-   if (!priv->phy)
-   return -ENODEV;
-
-   if (enable) {
-   int retval = usb_phy_init(priv->phy);
-
-   if (!retval)
-   retval = usb_phy_set_suspend(priv->phy, 0);
-   return retval;
-   }
-
-   usb_phy_set_suspend(priv->phy, 1);
-   usb_phy_shutdown(priv->phy);
-   return 0;
-}
-
-static int usbhs_hardware_init(struct platform_device *pdev)
-{
-   struct usbhs_private *priv = usbhs_get_priv(pdev);
-   struct usb_phy *phy;
-   int ret;
-
-   /* USB0 Function - use PWEN as GPIO input to detect DIP Switch SW5
-* setting to avoid VBUS short circuit due to wrong cable.
-* PWEN should be pulled up high if USB Function is selected by SW5
-*/
-   gpio_request_one(RCAR_GP_PIN(5, 18), GPIOF_IN, NULL); /* USB0_PWEN */
-   if (!gpio_get_value(RCAR_GP_PIN(5, 18))) {
-   pr_warn("Error: USB Function not selected - check SW5 + SW6\n");
-   ret = -ENOTSUPP;
-   goto error;
-   }
-
-   phy = usb_get_phy_dev(&pdev->dev, 0);
-   if (IS_ERR(phy)) {
-   ret = PTR_ERR(phy);
-   goto error;
-   }
-
-   priv->phy = phy;
-   return 0;
- error:
-   gpio_free(RCAR_GP_PIN(5, 18));
-   return ret;
-}
-
-static int usbhs_hardware_exit(struct platform_device *pdev)
-{
-   struct usbhs_private *priv = usbhs_get_priv(pdev);
-
-   if (!priv->phy)
-   return 0;
-
-   usb_put_phy(priv->phy);
-   priv->phy = NULL;
-
-   gpio_free(RCAR_GP_PIN(5, 18));
-   return 0;
-}
-
-static int usbhs_get_id(struct platform_device *pdev)
-{
-   return USBHS_GADGET;
-}
-
 static u32 lager_usbhs_pipe_type[] = {
USB_ENDPOINT_XFER_CONTROL,
USB_ENDPOINT_XFER_ISOC,
@@ -517,20 +439,19 @@ static u32 lager_usbhs_pipe_type[] = {
USB_ENDPOINT_XFER_BULK,
 };
 
-static struct usbhs_private usbhs_priv __initdata = {
-   .info = {
-   .platform_callback = {
-   .power_ctrl = usbhs_power_ctrl,
-   .hardware_init  = usbhs_hardware_init,
-   .hardware_exit  = usbhs_hardware_exit,
-   .get_id = usbhs_get_id,
-   },
-   .driver_param = {
-   .buswait_bwait  = 4,
-   .pipe_type = lager_usbhs_pipe_type,
-   .pipe_size = ARRAY_SIZE(lager_usbhs_pipe_type),
-   },
-   }
+static struct renesas_usbhs_platform_info usbhs_info __initdata = {
+   .driver_param = {
+   .buswait_bwait  = 4,
+   .type = USBHS_TYPE_R8A7790,
+   .pipe_type = lager_usbhs_pipe_type,
+   .pipe_size = ARRAY_SIZE(lager_usbhs_pipe_type),
+   /* USB0 Function - use PWEN as GPIO input to detect DIP
+* Switch SW5 setting to avoid VBUS short circuit due to
+* wrong cable.  PWEN should be pulled up high if USB
+* Function is selected by SW5.
+*/
+   .enable_gpio = RCAR_GP_PIN(5, 18),
+   },
 };
 
 static void __init lager_register_usbhs(void)
@@ -540,8 +461,8 @@ static void __init lager_register_usbhs(void)
  "renesas_usbhs", -1,
  usbhs_resources,
  ARRAY_SIZE(usbhs_resources),
- &usbhs_priv.info,
- sizeof(usbhs_priv.info));
+ &usbhs_info,
+ sizeof(usbhs_info));
 }
 
 /* USBHS PHY */
-- 
1.8.4.5

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


Re: [PATCH 9/9] ARM: shmobile: lager: add PCI USB host controllers

2013-11-21 Thread Ulrich Hecht
On Wed, Nov 20, 2013 at 10:24 PM, Valentine
 wrote:
> On 11/20/2013 09:38 PM, Ulrich Hecht wrote:
>> +   usb_bind_phy(":00:01.0", 0, "usb_phy_rcar_gen2");
>> +   usb_bind_phy(":00:02.0", 0, "usb_phy_rcar_gen2");
>
> You don't seem to register PCI controller 0 here. Thus, PCI bus 0 is the
> root bus of controller 1
> which has nothing to do with the USB phy.

Good point. I'll remove those.

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


Re: [PATCH 7/9] ARM: shmobile: r8a7790: add internal PCI clock

2013-11-21 Thread Ulrich Hecht
On Wed, Nov 20, 2013 at 10:18 PM, Valentine
 wrote:
> On 11/20/2013 09:38 PM, Ulrich Hecht wrote:
>> +   [MSTP703] = SH_CLK_MSTP32(&mp_clk, SMSTPCR7, 3, 0), /* EHCI */
>
> The comment to the above line is a bit misleading.

The comments reflect the labels given to the bits in the
documentation. The documentation labels this bit "EHCI".

>> +   CLKDEV_ICK_ID("usbpci", "pci-rcar-gen2.1", &mstp_clks[MSTP703]),
>> +   CLKDEV_ICK_ID("usbpci", "pci-rcar-gen2.2", &mstp_clks[MSTP703]),
>
>
> The CLKDEV_DEV_ID should be used instead for both pci clocks.

Will fix that.

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


Re: [PATCH 0/9] USB 2.0 host on Lager

2013-11-21 Thread Ulrich Hecht
On Wed, Nov 20, 2013 at 10:07 PM, Valentine
 wrote:
> On 11/20/2013 09:37 PM, Ulrich Hecht wrote:
>> I chose to do incremental patches on top of Valentine's stuff because his
>> patches are already in various states of upstream acceptance;
>
> Why re-post them then?

Because I am not entirely sure about the status of all of them.

> In fact I was going to add USB Host support once USBHS support is commited.

I was not aware of your intention to do so (could I have been?), and I
have a deadline on the 29th.

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


[PATCH 9/9] ARM: shmobile: lager: add PCI USB host controllers

2013-11-20 Thread Ulrich Hecht
Adds USB1 and 2 as hosts and binds them to the USB phy.

Signed-off-by: Ulrich Hecht 
---
 arch/arm/mach-shmobile/Kconfig   |  1 +
 arch/arm/mach-shmobile/board-lager.c | 23 +++
 2 files changed, 24 insertions(+)

diff --git a/arch/arm/mach-shmobile/Kconfig b/arch/arm/mach-shmobile/Kconfig
index 557f55c..e93812f 100644
--- a/arch/arm/mach-shmobile/Kconfig
+++ b/arch/arm/mach-shmobile/Kconfig
@@ -244,6 +244,7 @@ config MACH_LAGER
bool "Lager board"
depends on ARCH_R8A7790
select USE_OF
+   select PCI
 
 config MACH_LAGER_REFERENCE
bool "Lager board - Reference Device Tree Implementation"
diff --git a/arch/arm/mach-shmobile/board-lager.c 
b/arch/arm/mach-shmobile/board-lager.c
index efe242d8..71d4482 100644
--- a/arch/arm/mach-shmobile/board-lager.c
+++ b/arch/arm/mach-shmobile/board-lager.c
@@ -271,6 +271,17 @@ static const struct resource usbhs_phy_resources[] 
__initconst = {
DEFINE_RES_MEM(0xe6590100, 0x100),
 };
 
+static const struct resource usbhs_pci1_resources[] __initconst = {
+   DEFINE_RES_MEM(0xee0b, 0xc00),
+   DEFINE_RES_MEM(0xee0a, 0x1100),
+   DEFINE_RES_IRQ(gic_spi(112)),
+};
+static const struct resource usbhs_pci2_resources[] __initconst = {
+   DEFINE_RES_MEM(0xee0d, 0xc00),
+   DEFINE_RES_MEM(0xee0c, 0x1100),
+   DEFINE_RES_IRQ(gic_spi(113)),
+};
+
 static const struct pinctrl_map lager_pinctrl_map[] = {
/* DU (CN10: ARGB0, CN13: LVDS) */
PIN_MAP_MUX_GROUP_DEFAULT("rcar-du-r8a7790", "pfc-r8a7790",
@@ -337,6 +348,18 @@ static void __init lager_add_standard_devices(void)
  sizeof(usbhs_phy_pdata));
lager_register_usbhs();
 
+   usb_bind_phy(":00:01.0", 0, "usb_phy_rcar_gen2");
+   usb_bind_phy(":00:02.0", 0, "usb_phy_rcar_gen2");
+   usb_bind_phy(":01:01.0", 0, "usb_phy_rcar_gen2");
+   usb_bind_phy(":01:02.0", 0, "usb_phy_rcar_gen2");
+
+   platform_device_register_simple("pci-rcar-gen2", 1,
+   usbhs_pci1_resources,
+   ARRAY_SIZE(usbhs_pci1_resources));
+   platform_device_register_simple("pci-rcar-gen2", 2,
+   usbhs_pci2_resources,
+   ARRAY_SIZE(usbhs_pci2_resources));
+
lager_add_du_device();
 }
 
-- 
1.8.4

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


[PATCH 5/9] arm: shmobile: lager: Add USBHS support

2013-11-20 Thread Ulrich Hecht
From: Valentine Barshak 

This adds USBHS PHY and registers USBHS device if the driver is enabled.

Signed-off-by: Valentine Barshak 
Acked-by: Kuninori Morimoto 
---
 arch/arm/mach-shmobile/board-lager.c | 115 +++
 1 file changed, 115 insertions(+)

diff --git a/arch/arm/mach-shmobile/board-lager.c 
b/arch/arm/mach-shmobile/board-lager.c
index 8430fbc..efe242d8 100644
--- a/arch/arm/mach-shmobile/board-lager.c
+++ b/arch/arm/mach-shmobile/board-lager.c
@@ -18,6 +18,7 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
+#include 
 #include 
 #include 
 #include 
@@ -29,11 +30,14 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
 #include 
 #include 
+#include 
+#include 
 #include 
 #include 
 #include 
@@ -166,6 +170,107 @@ static const struct resource ether_resources[] 
__initconst = {
DEFINE_RES_IRQ(gic_spi(162)),
 };
 
+/* USBHS */
+#if IS_ENABLED(CONFIG_USB_RENESAS_USBHS_UDC)
+static const struct resource usbhs_resources[] __initconst = {
+   DEFINE_RES_MEM(0xe659, 0x100),
+   DEFINE_RES_IRQ(gic_spi(107)),
+};
+
+struct usbhs_private {
+   struct renesas_usbhs_platform_info info;
+   struct usb_phy *phy;
+};
+
+#define usbhs_get_priv(pdev) \
+   container_of(renesas_usbhs_get_info(pdev), struct usbhs_private, info)
+
+static int usbhs_power_ctrl(struct platform_device *pdev,
+   void __iomem *base, int enable)
+{
+   struct usbhs_private *priv = usbhs_get_priv(pdev);
+
+   if (!priv->phy)
+   return -ENODEV;
+
+   if (enable) {
+   int retval = usb_phy_init(priv->phy);
+
+   if (!retval)
+   retval = usb_phy_set_suspend(priv->phy, 0);
+   return retval;
+   }
+
+   usb_phy_set_suspend(priv->phy, 1);
+   usb_phy_shutdown(priv->phy);
+   return 0;
+}
+
+static int usbhs_hardware_init(struct platform_device *pdev)
+{
+   struct usbhs_private *priv = usbhs_get_priv(pdev);
+   struct usb_phy *phy;
+
+   phy = usb_get_phy(USB_PHY_TYPE_USB2);
+   if (IS_ERR(phy))
+   return PTR_ERR(phy);
+
+   priv->phy = phy;
+   return 0;
+}
+
+static int usbhs_hardware_exit(struct platform_device *pdev)
+{
+   struct usbhs_private *priv = usbhs_get_priv(pdev);
+
+   if (!priv->phy)
+   return 0;
+
+   usb_put_phy(priv->phy);
+   priv->phy = NULL;
+   return 0;
+}
+
+static int usbhs_get_id(struct platform_device *pdev)
+{
+   return USBHS_GADGET;
+}
+
+static struct usbhs_private usbhs_priv __initdata = {
+   .info = {
+   .platform_callback = {
+   .power_ctrl = usbhs_power_ctrl,
+   .hardware_init  = usbhs_hardware_init,
+   .hardware_exit  = usbhs_hardware_exit,
+   .get_id = usbhs_get_id,
+   },
+   .driver_param = {
+   .buswait_bwait  = 4,
+   },
+   }
+};
+
+#define lager_register_usbhs() \
+   platform_device_register_resndata(&platform_bus,\
+ "renesas_usbhs", -1,  \
+ usbhs_resources,  \
+ ARRAY_SIZE(usbhs_resources),  \
+ &usbhs_priv.info, \
+ sizeof(usbhs_priv.info))
+#else  /* CONFIG_USB_RENESAS_USBHS_UDC */
+#define lager_register_usbhs()
+#endif /* CONFIG_USB_RENESAS_USBHS_UDC */
+
+/* USBHS PHY */
+static const struct rcar_gen2_phy_platform_data usbhs_phy_pdata __initconst = {
+   .chan0_pci = 0, /* Channel 0 is USBHS */
+   .chan2_pci = 1, /* Channel 2 is PCI USB */
+};
+
+static const struct resource usbhs_phy_resources[] __initconst = {
+   DEFINE_RES_MEM(0xe6590100, 0x100),
+};
+
 static const struct pinctrl_map lager_pinctrl_map[] = {
/* DU (CN10: ARGB0, CN13: LVDS) */
PIN_MAP_MUX_GROUP_DEFAULT("rcar-du-r8a7790", "pfc-r8a7790",
@@ -194,6 +299,9 @@ static const struct pinctrl_map lager_pinctrl_map[] = {
  "eth_rmii", "eth"),
PIN_MAP_MUX_GROUP_DEFAULT("r8a7790-ether", "pfc-r8a7790",
  "intc_irq0", "intc"),
+   /* USB0 */
+   PIN_MAP_MUX_GROUP_DEFAULT("renesas_usbhs", "pfc-r8a7790",
+ "usb0", "usb0"),
 };
 
 static void __init lager_add_standard_devices(void)
@@ -222,6 +330,13 @@ static void __init lager_add_standard_devices(void)
  ARRAY_SIZE(ether_resources),
  ðer_pdata, sizeof(ether_pdata));
 
+   platform_device_register_resndata(&platform_bus, "usb_phy_rcar_gen2",
+ -

[PATCH 7/9] ARM: shmobile: r8a7790: add internal PCI clock

2013-11-20 Thread Ulrich Hecht
Adds clock for internal PCI host controllers.

Signed-off-by: Ulrich Hecht 
---
 arch/arm/mach-shmobile/clock-r8a7790.c | 5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/arm/mach-shmobile/clock-r8a7790.c 
b/arch/arm/mach-shmobile/clock-r8a7790.c
index 6107571..5a84698 100644
--- a/arch/arm/mach-shmobile/clock-r8a7790.c
+++ b/arch/arm/mach-shmobile/clock-r8a7790.c
@@ -187,7 +187,7 @@ enum {
MSTP813,
MSTP726, MSTP725, MSTP724, MSTP723, MSTP722, MSTP721, MSTP720,
MSTP717, MSTP716,
-   MSTP704,
+   MSTP704, MSTP703,
MSTP522,
MSTP315, MSTP314, MSTP313, MSTP312, MSTP311, MSTP305, MSTP304,
MSTP216, MSTP207, MSTP206, MSTP204, MSTP203, MSTP202,
@@ -212,6 +212,7 @@ static struct clk mstp_clks[MSTP_NR] = {
[MSTP717] = SH_CLK_MSTP32(&zs_clk, SMSTPCR7, 17, 0), /* HSCIF0 */
[MSTP716] = SH_CLK_MSTP32(&zs_clk, SMSTPCR7, 16, 0), /* HSCIF1 */
[MSTP704] = SH_CLK_MSTP32(&mp_clk, SMSTPCR7, 4, 0), /* HSUSB */
+   [MSTP703] = SH_CLK_MSTP32(&mp_clk, SMSTPCR7, 3, 0), /* EHCI */
[MSTP522] = SH_CLK_MSTP32(&extal_clk, SMSTPCR5, 22, 0), /* Thermal */
[MSTP315] = SH_CLK_MSTP32(&div6_clks[DIV6_MMC0], SMSTPCR3, 15, 0), /* 
MMC0 */
[MSTP314] = SH_CLK_MSTP32(&div4_clks[DIV4_SD0], SMSTPCR3, 14, 0), /* 
SDHI0 */
@@ -303,6 +304,8 @@ static struct clk_lookup lookups[] = {
CLKDEV_DEV_ID("qspi.0", &mstp_clks[MSTP917]),
CLKDEV_DEV_ID("renesas_usbhs", &mstp_clks[MSTP704]),
CLKDEV_ICK_ID("usbhs", "usb_phy_rcar_gen2", &mstp_clks[MSTP704]),
+   CLKDEV_ICK_ID("usbpci", "pci-rcar-gen2.1", &mstp_clks[MSTP703]),
+   CLKDEV_ICK_ID("usbpci", "pci-rcar-gen2.2", &mstp_clks[MSTP703]),
 };
 
 #define R8A7790_CLOCK_ROOT(e, m, p0, p1, p30, p31) \
-- 
1.8.4

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


[PATCH 4/9] usb: phy: Add RCAR Gen2 USB phy

2013-11-20 Thread Ulrich Hecht
From: Valentine Barshak 

This adds RCAR Gen2 USB phy support. The driver configures
USB channels 0/2 which are shared between PCI USB hosts and
USBHS/USBSS devices. It also controls internal USBHS phy.

Signed-off-by: Valentine Barshak 
---
 drivers/usb/phy/Kconfig |  13 ++
 drivers/usb/phy/Makefile|   1 +
 drivers/usb/phy/phy-rcar-gen2-usb.c | 248 
 include/linux/platform_data/usb-rcar-gen2-phy.h |  22 +++
 4 files changed, 284 insertions(+)
 create mode 100644 drivers/usb/phy/phy-rcar-gen2-usb.c
 create mode 100644 include/linux/platform_data/usb-rcar-gen2-phy.h

diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig
index d5589f9..c0c8cd3 100644
--- a/drivers/usb/phy/Kconfig
+++ b/drivers/usb/phy/Kconfig
@@ -214,6 +214,19 @@ config USB_RCAR_PHY
  To compile this driver as a module, choose M here: the
  module will be called phy-rcar-usb.
 
+config USB_RCAR_GEN2_PHY
+   tristate "Renesas R-Car Gen2 USB PHY support"
+   depends on ARCH_R8A7790 || ARCH_R8A7791 || COMPILE_TEST
+   select USB_PHY
+   help
+ Say Y here to add support for the Renesas R-Car Gen2 USB PHY driver.
+ It is typically used to control internal USB PHY for USBHS,
+ and to configure shared USB channels 0 and 2.
+ This driver supports R8A7790 and R8A7791.
+
+ To compile this driver as a module, choose M here: the
+ module will be called phy-rcar-gen2-usb.
+
 config USB_ULPI
bool "Generic ULPI Transceiver Driver"
depends on ARM
diff --git a/drivers/usb/phy/Makefile b/drivers/usb/phy/Makefile
index 2135e85..8c5b147 100644
--- a/drivers/usb/phy/Makefile
+++ b/drivers/usb/phy/Makefile
@@ -29,5 +29,6 @@ obj-$(CONFIG_USB_MSM_OTG) += phy-msm-usb.o
 obj-$(CONFIG_USB_MV_OTG)   += phy-mv-usb.o
 obj-$(CONFIG_USB_MXS_PHY)  += phy-mxs-usb.o
 obj-$(CONFIG_USB_RCAR_PHY) += phy-rcar-usb.o
+obj-$(CONFIG_USB_RCAR_GEN2_PHY)+= phy-rcar-gen2-usb.o
 obj-$(CONFIG_USB_ULPI) += phy-ulpi.o
 obj-$(CONFIG_USB_ULPI_VIEWPORT)+= phy-ulpi-viewport.o
diff --git a/drivers/usb/phy/phy-rcar-gen2-usb.c 
b/drivers/usb/phy/phy-rcar-gen2-usb.c
new file mode 100644
index 000..a99a695
--- /dev/null
+++ b/drivers/usb/phy/phy-rcar-gen2-usb.c
@@ -0,0 +1,248 @@
+/*
+ * Renesas R-Car Gen2 USB phy driver
+ *
+ * Copyright (C) 2013 Renesas Solutions Corp.
+ * Copyright (C) 2013 Cogent Embedded, Inc.
+ *
+ * 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 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+struct rcar_gen2_usb_phy_priv {
+   struct usb_phy phy;
+   void __iomem *base;
+   struct clk *clk;
+   spinlock_t lock;
+   int usecount;
+   u32 ugctrl2;
+};
+
+#define usb_phy_to_priv(p) container_of(p, struct rcar_gen2_usb_phy_priv, phy)
+
+/* Low Power Status register */
+#define USBHS_LPSTS_REG0x02
+#define USBHS_LPSTS_SUSPM  (1 << 14)
+
+/* USB General control register */
+#define USBHS_UGCTRL_REG   0x80
+#define USBHS_UGCTRL_CONNECT   (1 << 2)
+#define USBHS_UGCTRL_PLLRESET  (1 << 0)
+
+/* USB General control register 2 */
+#define USBHS_UGCTRL2_REG  0x84
+#define USBHS_UGCTRL2_USB0_PCI (1 << 4)
+#define USBHS_UGCTRL2_USB0_HS  (3 << 4)
+#define USBHS_UGCTRL2_USB2_PCI (0 << 31)
+#define USBHS_UGCTRL2_USB2_SS  (1 << 31)
+
+/* USB General status register */
+#define USBHS_UGSTS_REG0x88
+#define USBHS_UGSTS_LOCK   (3 << 8)
+
+/* Enable USBHS internal phy */
+static int __rcar_gen2_usbhs_phy_enable(void __iomem *base)
+{
+   u32 val;
+   int i;
+
+   /* USBHS PHY power on */
+   val = ioread32(base + USBHS_UGCTRL_REG);
+   val &= ~USBHS_UGCTRL_PLLRESET;
+   iowrite32(val, base + USBHS_UGCTRL_REG);
+
+   val = ioread16(base + USBHS_LPSTS_REG);
+   val |= USBHS_LPSTS_SUSPM;
+   iowrite16(val, base + USBHS_LPSTS_REG);
+
+   for (i = 0; i < 20; i++) {
+   val = ioread32(base + USBHS_UGSTS_REG);
+   if ((val & USBHS_UGSTS_LOCK) == USBHS_UGSTS_LOCK) {
+   val = ioread32(base + USBHS_UGCTRL_REG);
+   val |= USBHS_UGCTRL_CONNECT;
+   iowrite32(val, base + USBHS_UGCTRL_REG);
+   return 0;
+   }
+   udelay(1);
+   }
+
+   /* Timed out waiting for the PLL lock */
+   return -ETIMEDOUT;
+}
+
+/* Disable USBHS internal phy */
+static int __rcar_gen2_usbhs_phy_disable(void __iomem *base)
+{
+   u32 val;
+
+   /* USBHS PHY power off */
+   val = ioread32(base + USBHS_UGCTRL_REG)

[PATCH 3/9] usb: hcd: Initialize USB phy if needed

2013-11-20 Thread Ulrich Hecht
From: Valentine Barshak 

This adds external USB phy support to USB HCD driver that
allows to find and initialize external USB phy, bound to
the HCD, when the HCD is added.
The usb_add_hcd function returns -EPROBE_DEFER if the USB
phy, bound to the HCD, is not ready.
If no USB phy is bound, the HCD is initialized as usual.

Signed-off-by: Valentine Barshak 
Acked-by: Alan Stern 
---
 drivers/usb/core/hcd.c | 20 
 1 file changed, 20 insertions(+)

diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index d939521..fd09ec6 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -2597,6 +2597,26 @@ int usb_add_hcd(struct usb_hcd *hcd,
int retval;
struct usb_device *rhdev;
 
+#ifdef CONFIG_USB_PHY
+   if (!hcd->phy) {
+   struct usb_phy *phy = usb_get_phy_dev(hcd->self.controller, 0);
+
+   if (IS_ERR(phy)) {
+   retval = PTR_ERR(phy);
+   if (retval == -EPROBE_DEFER)
+   return retval;
+   } else {
+   retval = usb_phy_init(phy);
+   if (retval) {
+   usb_put_phy(phy);
+   return retval;
+   }
+   hcd->phy = phy;
+   hcd->remove_phy = 1;
+   }
+   }
+#endif
+
dev_info(hcd->self.controller, "%s\n", hcd->product_desc);
 
/* Keep old behaviour if authorized_default is not in [0, 1]. */
-- 
1.8.4

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


[PATCH 6/9] pci: rcar-gen2: enable clock

2013-11-20 Thread Ulrich Hecht
Makes the PCI host controllers come alive.

Signed-off-by: Ulrich Hecht 
---
 drivers/pci/host/pci-rcar-gen2.c | 14 ++
 1 file changed, 14 insertions(+)

diff --git a/drivers/pci/host/pci-rcar-gen2.c b/drivers/pci/host/pci-rcar-gen2.c
index cbaa5c4..568ff8e 100644
--- a/drivers/pci/host/pci-rcar-gen2.c
+++ b/drivers/pci/host/pci-rcar-gen2.c
@@ -9,6 +9,7 @@
  * published by the Free Software Foundation.
  */
 
+#include 
 #include 
 #include 
 #include 
@@ -77,6 +78,7 @@
 #define RCAR_PCI_NR_CONTROLLERS3
 
 struct rcar_pci_priv {
+   struct clk *clk;
void __iomem *reg;
struct resource io_res;
struct resource mem_res;
@@ -169,6 +171,9 @@ static int __init rcar_pci_setup(int nr, struct 
pci_sys_data *sys)
void __iomem *reg = priv->reg;
u32 val;
 
+   clk_prepare_enable(priv->clk);
+   udelay(4);
+
val = ioread32(reg + RCAR_PCI_UNIT_REV_REG);
pr_info("PCI: bus%u revision %x\n", sys->busnr, val);
 
@@ -273,6 +278,7 @@ static int __init rcar_pci_probe(struct platform_device 
*pdev)
struct resource *cfg_res, *mem_res;
struct rcar_pci_priv *priv;
void __iomem *reg;
+   struct clk *clk;
 
cfg_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
reg = devm_ioremap_resource(&pdev->dev, cfg_res);
@@ -288,6 +294,12 @@ static int __init rcar_pci_probe(struct platform_device 
*pdev)
if (!priv)
return -ENOMEM;
 
+   clk = devm_clk_get(&pdev->dev, "usbpci");
+   if (IS_ERR(clk)) {
+   dev_err(&pdev->dev, "Can't get clock\n");
+   return PTR_ERR(clk);
+   }
+
priv->mem_res = *mem_res;
/*
 * The controller does not support/use port I/O,
@@ -302,6 +314,8 @@ static int __init rcar_pci_probe(struct platform_device 
*pdev)
priv->irq = platform_get_irq(pdev, 0);
priv->reg = reg;
 
+   priv->clk = clk;
+
return rcar_pci_add_controller(priv);
 }
 
-- 
1.8.4

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


[PATCH 8/9] usb: phy: rcar-gen2: register using usb_add_phy_dev()

2013-11-20 Thread Ulrich Hecht
Allows binding of PCI USB host controllers to this phy.

Signed-off-by: Ulrich Hecht 
---
 drivers/usb/phy/phy-rcar-gen2-usb.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/phy/phy-rcar-gen2-usb.c 
b/drivers/usb/phy/phy-rcar-gen2-usb.c
index a99a695..25fdd91 100644
--- a/drivers/usb/phy/phy-rcar-gen2-usb.c
+++ b/drivers/usb/phy/phy-rcar-gen2-usb.c
@@ -212,8 +212,9 @@ static int rcar_gen2_usb_phy_probe(struct platform_device 
*pdev)
priv->phy.init = rcar_gen2_usb_phy_init;
priv->phy.shutdown = rcar_gen2_usb_phy_shutdown;
priv->phy.set_suspend = rcar_gen2_usb_phy_set_suspend;
+   priv->phy.type = USB_PHY_TYPE_USB2;
 
-   retval = usb_add_phy(&priv->phy, USB_PHY_TYPE_USB2);
+   retval = usb_add_phy_dev(&priv->phy);
if (retval < 0) {
dev_err(dev, "Failed to add USB phy\n");
return retval;
-- 
1.8.4

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


[PATCH 2/9] usb: hcd: Remove USB phy if needed

2013-11-20 Thread Ulrich Hecht
From: Valentine Barshak 

This adds remove_phy flag to the HCD structure. If the flag is
set and if hcd->phy is valid, the phy is shutdown and released
whenever usb_add_hcd fails or usb_hcd_remove is called.
This can be used by the HCD drivers to auto-remove
the external USB phy when it is no longer needed.

Signed-off-by: Valentine Barshak 
Acked-by: Alan Stern 
---
 drivers/usb/core/hcd.c  | 14 +-
 include/linux/usb/hcd.h |  1 +
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index d6a8d23..d939521 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -43,6 +43,7 @@
 
 #include 
 #include 
+#include 
 
 #include "usb.h"
 
@@ -2611,7 +2612,7 @@ int usb_add_hcd(struct usb_hcd *hcd,
 */
if ((retval = hcd_buffer_create(hcd)) != 0) {
dev_dbg(hcd->self.controller, "pool alloc failed\n");
-   return retval;
+   goto err_remove_phy;
}
 
if ((retval = usb_register_bus(&hcd->self)) < 0)
@@ -2742,6 +2743,12 @@ err_allocate_root_hub:
usb_deregister_bus(&hcd->self);
 err_register_bus:
hcd_buffer_destroy(hcd);
+err_remove_phy:
+   if (hcd->remove_phy && hcd->phy) {
+   usb_phy_shutdown(hcd->phy);
+   usb_put_phy(hcd->phy);
+   hcd->phy = NULL;
+   }
return retval;
 } 
 EXPORT_SYMBOL_GPL(usb_add_hcd);
@@ -2814,6 +2821,11 @@ void usb_remove_hcd(struct usb_hcd *hcd)
usb_put_dev(hcd->self.root_hub);
usb_deregister_bus(&hcd->self);
hcd_buffer_destroy(hcd);
+   if (hcd->remove_phy && hcd->phy) {
+   usb_phy_shutdown(hcd->phy);
+   usb_put_phy(hcd->phy);
+   hcd->phy = NULL;
+   }
 }
 EXPORT_SYMBOL_GPL(usb_remove_hcd);
 
diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
index 75efc45..9c2907b 100644
--- a/include/linux/usb/hcd.h
+++ b/include/linux/usb/hcd.h
@@ -133,6 +133,7 @@ struct usb_hcd {
unsignedrh_registered:1;/* is root hub registered? */
unsignedrh_pollable:1;  /* may we poll the root hub? */
unsignedmsix_enabled:1; /* driver has MSI-X enabled? */
+   unsignedremove_phy:1;   /* auto-remove USB phy */
 
/* The next flag is a stopgap, to be removed when all the HCDs
 * support the new root-hub polling mechanism. */
-- 
1.8.4

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


[PATCH 1/9] pci: Add R-Car Gen2 internal PCI support

2013-11-20 Thread Ulrich Hecht
From: Valentine Barshak 

This adds internal PCI controller driver for R-Car Gen2 SoC.
There are three PCI controllers available with only a single
EHCI/OHCI device built-in on each PCI bus.
This gives us three USB channels. Channel 0 is shared with
the USBHS device, while channel 2 is shared with the USBSS.

The PCI controllers do not support I/O port space mapping,
and it is not needed here.

Signed-off-by: Valentine Barshak 
---
 drivers/pci/host/Kconfig |   8 +
 drivers/pci/host/Makefile|   1 +
 drivers/pci/host/pci-rcar-gen2.c | 333 +++
 3 files changed, 342 insertions(+)
 create mode 100644 drivers/pci/host/pci-rcar-gen2.c

diff --git a/drivers/pci/host/Kconfig b/drivers/pci/host/Kconfig
index 3d95048..2e33c2b 100644
--- a/drivers/pci/host/Kconfig
+++ b/drivers/pci/host/Kconfig
@@ -19,4 +19,12 @@ config PCI_TEGRA
bool "NVIDIA Tegra PCIe controller"
depends on ARCH_TEGRA
 
+config PCI_RCAR_GEN2
+   bool "Renesas R-Car Gen2 Internal PCI controller"
+   depends on ARM && (ARCH_R8A7790 || ARCH_R8A7791 || COMPILE_TEST)
+   help
+ Say Y here if you want internal PCI support on R-Car Gen2 SoC.
+ There are 3 internal PCI controllers available with a single
+ built-in EHCI/OHCI host controller present on each one.
+
 endmenu
diff --git a/drivers/pci/host/Makefile b/drivers/pci/host/Makefile
index c9a997b..63d9727 100644
--- a/drivers/pci/host/Makefile
+++ b/drivers/pci/host/Makefile
@@ -2,3 +2,4 @@ obj-$(CONFIG_PCIE_DW) += pcie-designware.o
 obj-$(CONFIG_PCI_EXYNOS) += pci-exynos.o
 obj-$(CONFIG_PCI_MVEBU) += pci-mvebu.o
 obj-$(CONFIG_PCI_TEGRA) += pci-tegra.o
+obj-$(CONFIG_PCI_RCAR_GEN2) += pci-rcar-gen2.o
diff --git a/drivers/pci/host/pci-rcar-gen2.c b/drivers/pci/host/pci-rcar-gen2.c
new file mode 100644
index 000..cbaa5c4
--- /dev/null
+++ b/drivers/pci/host/pci-rcar-gen2.c
@@ -0,0 +1,333 @@
+/*
+ *  pci-rcar-gen2: internal PCI bus support
+ *
+ * Copyright (C) 2013 Renesas Solutions Corp.
+ * Copyright (C) 2013 Cogent Embedded, Inc.
+ *
+ * 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 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+/* AHB-PCI Bridge PCI communication registers */
+#define RCAR_AHBPCI_PCICOM_OFFSET  0x800
+
+#define RCAR_PCIAHB_WIN1_CTR_REG   (RCAR_AHBPCI_PCICOM_OFFSET + 0x00)
+#define RCAR_PCIAHB_WIN2_CTR_REG   (RCAR_AHBPCI_PCICOM_OFFSET + 0x04)
+#define RCAR_PCIAHB_PREFETCH0  0x0
+#define RCAR_PCIAHB_PREFETCH4  0x1
+#define RCAR_PCIAHB_PREFETCH8  0x2
+#define RCAR_PCIAHB_PREFETCH16 0x3
+
+#define RCAR_AHBPCI_WIN1_CTR_REG   (RCAR_AHBPCI_PCICOM_OFFSET + 0x10)
+#define RCAR_AHBPCI_WIN2_CTR_REG   (RCAR_AHBPCI_PCICOM_OFFSET + 0x14)
+#define RCAR_AHBPCI_WIN_CTR_MEM(3 << 1)
+#define RCAR_AHBPCI_WIN_CTR_CFG(5 << 1)
+#define RCAR_AHBPCI_WIN1_HOST  (1 << 30)
+#define RCAR_AHBPCI_WIN1_DEVICE(1 << 31)
+
+#define RCAR_PCI_INT_ENABLE_REG(RCAR_AHBPCI_PCICOM_OFFSET + 
0x20)
+#define RCAR_PCI_INT_STATUS_REG(RCAR_AHBPCI_PCICOM_OFFSET + 
0x24)
+#define RCAR_PCI_INT_A (1 << 16)
+#define RCAR_PCI_INT_B (1 << 17)
+#define RCAR_PCI_INT_PME   (1 << 19)
+
+#define RCAR_AHB_BUS_CTR_REG   (RCAR_AHBPCI_PCICOM_OFFSET + 0x30)
+#define RCAR_AHB_BUS_MMODE_HTRANS  (1 << 0)
+#define RCAR_AHB_BUS_MMODE_BYTE_BURST  (1 << 1)
+#define RCAR_AHB_BUS_MMODE_WR_INCR (1 << 2)
+#define RCAR_AHB_BUS_MMODE_HBUS_REQ(1 << 7)
+#define RCAR_AHB_BUS_SMODE_READYCTR(1 << 17)
+#define RCAR_AHB_BUS_MODE  (RCAR_AHB_BUS_MMODE_HTRANS |\
+   RCAR_AHB_BUS_MMODE_BYTE_BURST | \
+   RCAR_AHB_BUS_MMODE_WR_INCR |\
+   RCAR_AHB_BUS_MMODE_HBUS_REQ |   \
+   RCAR_AHB_BUS_SMODE_READYCTR)
+
+#define RCAR_USBCTR_REG(RCAR_AHBPCI_PCICOM_OFFSET + 
0x34)
+#define RCAR_USBCTR_USBH_RST   (1 << 0)
+#define RCAR_USBCTR_PCICLK_MASK(1 << 1)
+#define RCAR_USBCTR_PLL_RST(1 << 2)
+#define RCAR_USBCTR_DIRPD  (1 << 8)
+#define RCAR_USBCTR_PCIAHB_WIN2_EN (1 << 9)
+#define RCAR_USBCTR_PCIAHB_WIN1_256M   (0 << 10)
+#define RCAR_USBCTR_PCIAHB_WIN1_512M   (1 << 10)
+#define RCAR_USBCTR_PCIAHB_WIN1_1G (2 << 10)
+#define RCAR_USBCTR_PCIAHB_WIN1_2G (3 << 10)
+#define RCAR_USBCTR_PCIAHB_WIN1_MASK   (3 << 10)
+
+#define RCAR_PCI_ARBITER_CTR_REG   (RCAR_AHBPCI_PCICOM_OFFSET + 0x40)
+#define RCAR_PCI_ARBITER_PCIREQ0   (1 << 0)
+#define RCAR_PCI_ARBITER_PCIREQ1   (1 << 1)
+#define RCAR_PCI_ARBITER_PCIBP_MODE(1 << 12)

[PATCH 0/9] USB 2.0 host on Lager

2013-11-20 Thread Ulrich Hecht
This is a collection of patches developed by Valentine Barshak towards
support of the PCI-attached USB 2.0 host controllers on Lager, with some
glue supplied by me:

- added missing PCI host clock (MSTP703)
- bound PCI USB HCIs to the USB phy
- added PCI host platform devices on Lager

I chose to do incremental patches on top of Valentine's stuff because his
patches are already in various states of upstream acceptance; please tell me
if you need this packaged differently.

CU
Uli

Ulrich Hecht (4):
  pci: rcar-gen2: enable clock
  ARM: shmobile: r8a7790: add internal PCI clock
  usb: phy: rcar-gen2: register using usb_add_phy_dev()
  ARM: shmobile: lager: add PCI USB host controllers

Valentine Barshak (5):
  pci: Add R-Car Gen2 internal PCI support
  usb: hcd: Remove USB phy if needed
  usb: hcd: Initialize USB phy if needed
  usb: phy: Add RCAR Gen2 USB phy
  arm: shmobile: lager: Add USBHS support

 arch/arm/mach-shmobile/Kconfig  |   1 +
 arch/arm/mach-shmobile/board-lager.c| 138 ++
 arch/arm/mach-shmobile/clock-r8a7790.c  |   5 +-
 drivers/pci/host/Kconfig|   8 +
 drivers/pci/host/Makefile   |   1 +
 drivers/pci/host/pci-rcar-gen2.c| 347 
 drivers/usb/core/hcd.c  |  34 ++-
 drivers/usb/phy/Kconfig |  13 +
 drivers/usb/phy/Makefile|   1 +
 drivers/usb/phy/phy-rcar-gen2-usb.c | 249 +
 include/linux/platform_data/usb-rcar-gen2-phy.h |  22 ++
 include/linux/usb/hcd.h |   1 +
 12 files changed, 818 insertions(+), 2 deletions(-)
 create mode 100644 drivers/pci/host/pci-rcar-gen2.c
 create mode 100644 drivers/usb/phy/phy-rcar-gen2-usb.c
 create mode 100644 include/linux/platform_data/usb-rcar-gen2-phy.h

-- 
1.8.4

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


Re: [PATCH] usb: phy: Move R-Car Gen2 driver registration to postcore_inictall

2013-10-31 Thread Ulrich Hecht
On Thu, Oct 31, 2013 at 12:43 PM, Valentine
 wrote:
> Please, let me know if you see better options.

How about disregarding the whole PCI aspect? I mean, yes, those are
PCI busses, but they are internal, with a fixed set of devices
attached, and as far as I can tell there are no other PCI busses in
the system. So how about treating the USB host controllers as platform
devices the way it's done in the vendor kernel, saving us the trouble
of pulling in the entire PCI subsystem without any tangible benefit?

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