usb: gadget: renesas_usbhs: add usbhs_set_device_speed() support for host
mod_host needs device speed setup function Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Felipe Balbi <balbi@ti.com>hifive-unleashed-5.1
parent
a9be4a4562
commit
eb05191f6a
|
@ -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;
|
||||||
#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;
|
||||||
/* 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);
|
||||||
*/
|
*/
|
||||||
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
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue