Commit eb05191f authored by Kuninori Morimoto's avatar Kuninori Morimoto Committed by Felipe Balbi

usb: gadget: renesas_usbhs: add usbhs_set_device_speed() support for host

mod_host needs device speed setup function
Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent a9be4a45
...@@ -226,6 +226,48 @@ static void usbhsc_bus_init(struct usbhs_priv *priv) ...@@ -226,6 +226,48 @@ static void usbhsc_bus_init(struct usbhs_priv *priv)
usbhs_vbus_ctrl(priv, 0); usbhs_vbus_ctrl(priv, 0);
} }
/*
* device configuration
*/
int usbhs_set_device_speed(struct usbhs_priv *priv, int devnum,
u16 upphub, u16 hubport, u16 speed)
{
struct device *dev = usbhs_priv_to_dev(priv);
u16 usbspd = 0;
u32 reg = DEVADD0 + (2 * devnum);
if (devnum > 10) {
dev_err(dev, "cannot set speed to unknown device %d\n", devnum);
return -EIO;
}
if (upphub > 0xA) {
dev_err(dev, "unsupported hub number %d\n", upphub);
return -EIO;
}
switch (speed) {
case USB_SPEED_LOW:
usbspd = USBSPD_SPEED_LOW;
break;
case USB_SPEED_FULL:
usbspd = USBSPD_SPEED_FULL;
break;
case USB_SPEED_HIGH:
usbspd = USBSPD_SPEED_HIGH;
break;
default:
dev_err(dev, "unsupported speed %d\n", speed);
return -EIO;
}
usbhs_write(priv, reg, UPPHUB(upphub) |
HUBPORT(hubport)|
USBSPD(usbspd));
return 0;
}
/* /*
* local functions * local functions
*/ */
......
...@@ -90,6 +90,17 @@ struct usbhs_priv; ...@@ -90,6 +90,17 @@ struct usbhs_priv;
#define PIPE9TRN 0x00BA #define PIPE9TRN 0x00BA
#define PIPEATRE 0x00BC #define PIPEATRE 0x00BC
#define PIPEATRN 0x00BE #define PIPEATRN 0x00BE
#define DEVADD0 0x00D0 /* Device address n configuration */
#define DEVADD1 0x00D2
#define DEVADD2 0x00D4
#define DEVADD3 0x00D6
#define DEVADD4 0x00D8
#define DEVADD5 0x00DA
#define DEVADD6 0x00DC
#define DEVADD7 0x00DE
#define DEVADD8 0x00E0
#define DEVADD9 0x00E2
#define DEVADDA 0x00E4
/* SYSCFG */ /* SYSCFG */
#define SCKE (1 << 10) /* USB Module Clock Enable */ #define SCKE (1 << 10) /* USB Module Clock Enable */
...@@ -206,6 +217,14 @@ struct usbhs_priv; ...@@ -206,6 +217,14 @@ struct usbhs_priv;
/* FRMNUM */ /* FRMNUM */
#define FRNM_MASK (0x7FF) #define FRNM_MASK (0x7FF)
/* DEVADDn */
#define UPPHUB(x) (((x) & 0xF) << 11) /* HUB Register */
#define HUBPORT(x) (((x) & 0x7) << 8) /* HUB Port for Target Device */
#define USBSPD(x) (((x) & 0x3) << 6) /* Device Transfer Rate */
#define USBSPD_SPEED_LOW 0x1
#define USBSPD_SPEED_FULL 0x2
#define USBSPD_SPEED_HIGH 0x3
/* /*
* struct * struct
*/ */
...@@ -280,6 +299,12 @@ int usbhs_vbus_ctrl(struct usbhs_priv *priv, int enable); ...@@ -280,6 +299,12 @@ int usbhs_vbus_ctrl(struct usbhs_priv *priv, int enable);
*/ */
int usbhs_frame_get_num(struct usbhs_priv *priv); int usbhs_frame_get_num(struct usbhs_priv *priv);
/*
* device config
*/
int usbhs_set_device_speed(struct usbhs_priv *priv, int devnum, u16 upphub,
u16 hubport, u16 speed);
/* /*
* data * data
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment