usb: gadget: renesas_usbhs: add bus control functions
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tue, 11 Oct 2011 05:01:40 +0000 (22:01 -0700)
committerFelipe Balbi <balbi@ti.com>
Thu, 13 Oct 2011 17:41:38 +0000 (20:41 +0300)
this patch add DVSTCTR control function for HOST support

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/renesas_usbhs/common.c
drivers/usb/renesas_usbhs/common.h
include/linux/usb/renesas_usbhs.h

index fd43fdd..243512d 100644 (file)
@@ -146,6 +146,33 @@ int usbhs_frame_get_num(struct usbhs_priv *priv)
        return usbhs_read(priv, FRMNUM) & FRNM_MASK;
 }
 
+/*
+ *             bus/vbus functions
+ */
+void usbhs_bus_send_sof_enable(struct usbhs_priv *priv)
+{
+       usbhs_bset(priv, DVSTCTR, (USBRST | UACT), UACT);
+}
+
+void usbhs_bus_send_reset(struct usbhs_priv *priv)
+{
+       usbhs_bset(priv, DVSTCTR, (USBRST | UACT), USBRST);
+}
+
+int usbhs_vbus_ctrl(struct usbhs_priv *priv, int enable)
+{
+       struct platform_device *pdev = usbhs_priv_to_pdev(priv);
+
+       return usbhs_platform_call(priv, set_vbus, pdev, enable);
+}
+
+static void usbhsc_bus_init(struct usbhs_priv *priv)
+{
+       usbhs_write(priv, DVSTCTR, 0);
+
+       usbhs_vbus_ctrl(priv, 0);
+}
+
 /*
  *             local functions
  */
@@ -187,7 +214,6 @@ static void usbhsc_power_ctrl(struct usbhs_priv *priv, int enable)
 
                /* USB on */
                usbhs_sys_clock_ctrl(priv, enable);
-               usbhsc_set_buswait(priv);
        } else {
                /* USB off */
                usbhs_sys_clock_ctrl(priv, enable);
@@ -229,6 +255,10 @@ static void usbhsc_hotplug(struct usbhs_priv *priv)
                if (usbhsc_flags_has(priv, USBHSF_RUNTIME_PWCTRL))
                        usbhsc_power_ctrl(priv, enable);
 
+               /* bus init */
+               usbhsc_set_buswait(priv);
+               usbhsc_bus_init(priv);
+
                /* module start */
                usbhs_mod_call(priv, start, priv);
 
@@ -238,6 +268,9 @@ static void usbhsc_hotplug(struct usbhs_priv *priv)
                /* module stop */
                usbhs_mod_call(priv, stop, priv);
 
+               /* bus init */
+               usbhsc_bus_init(priv);
+
                /* power off */
                if (usbhsc_flags_has(priv, USBHSF_RUNTIME_PWCTRL))
                        usbhsc_power_ctrl(priv, enable);
index b410463..54b5924 100644 (file)
@@ -102,6 +102,8 @@ struct usbhs_priv;
 /* DVSTCTR */
 #define EXTLP  (1 << 10)       /* Controls the EXTLP pin output state */
 #define PWEN   (1 << 9)        /* Controls the PWEN pin output state */
+#define USBRST (1 << 6)        /* Bus Reset Output */
+#define UACT   (1 << 4)        /* USB Bus Enable */
 #define RHST   (0x7)           /* Reset Handshake */
 #define  RHST_LOW_SPEED  1     /* Low-speed connection */
 #define  RHST_FULL_SPEED 2     /* Full-speed connection */
@@ -257,6 +259,13 @@ void usbhs_sys_usb_ctrl(struct usbhs_priv *priv, int enable);
 void usbhs_sys_host_ctrl(struct usbhs_priv *priv, int enable);
 void usbhs_sys_function_ctrl(struct usbhs_priv *priv, int enable);
 
+/*
+ * bus
+ */
+void usbhs_bus_send_sof_enable(struct usbhs_priv *priv);
+void usbhs_bus_send_reset(struct usbhs_priv *priv);
+int usbhs_vbus_ctrl(struct usbhs_priv *priv, int enable);
+
 /*
  * frame
  */
index 959af02..040d8bb 100644 (file)
@@ -82,6 +82,13 @@ struct renesas_usbhs_platform_callback {
         * get VBUS status function.
         */
        int (*get_vbus)(struct platform_device *pdev);
+
+       /*
+        * option:
+        *
+        * VBUS control is needed for Host
+        */
+       int (*set_vbus)(struct platform_device *pdev, int enable);
 };
 
 /*