usb: mtu3: add support for usb3.1 IP
Support SuperSpeedPlus for usb3.1 device IP Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com> Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
This commit is contained in:
parent
c776f2c3e8
commit
4d79e042ed
|
@ -94,6 +94,7 @@ enum mtu3_speed {
|
|||
MTU3_SPEED_FULL = 1,
|
||||
MTU3_SPEED_HIGH = 3,
|
||||
MTU3_SPEED_SUPER = 4,
|
||||
MTU3_SPEED_SUPER_PLUS = 5,
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -237,7 +237,7 @@ void mtu3_ep_stall_set(struct mtu3_ep *mep, bool set)
|
|||
|
||||
void mtu3_dev_on_off(struct mtu3 *mtu, int is_on)
|
||||
{
|
||||
if (mtu->is_u3_ip && (mtu->max_speed == USB_SPEED_SUPER))
|
||||
if (mtu->is_u3_ip && mtu->max_speed >= USB_SPEED_SUPER)
|
||||
mtu3_ss_func_set(mtu, is_on);
|
||||
else
|
||||
mtu3_hs_softconn_set(mtu, is_on);
|
||||
|
@ -547,6 +547,9 @@ static void mtu3_set_speed(struct mtu3 *mtu)
|
|||
mtu3_clrbits(mbase, U3D_USB3_CONFIG, USB3_EN);
|
||||
/* HS/FS detected by HW */
|
||||
mtu3_setbits(mbase, U3D_POWER_MANAGEMENT, HS_ENABLE);
|
||||
} else if (mtu->max_speed == USB_SPEED_SUPER) {
|
||||
mtu3_clrbits(mtu->ippc_base, SSUSB_U3_CTRL(0),
|
||||
SSUSB_U3_PORT_SSP_SPEED);
|
||||
}
|
||||
|
||||
dev_info(mtu->dev, "max_speed: %s\n",
|
||||
|
@ -624,6 +627,10 @@ static irqreturn_t mtu3_link_isr(struct mtu3 *mtu)
|
|||
udev_speed = USB_SPEED_SUPER;
|
||||
maxpkt = 512;
|
||||
break;
|
||||
case MTU3_SPEED_SUPER_PLUS:
|
||||
udev_speed = USB_SPEED_SUPER_PLUS;
|
||||
maxpkt = 512;
|
||||
break;
|
||||
default:
|
||||
udev_speed = USB_SPEED_UNKNOWN;
|
||||
break;
|
||||
|
@ -825,14 +832,15 @@ int ssusb_gadget_init(struct ssusb_mtk *ssusb)
|
|||
case USB_SPEED_FULL:
|
||||
case USB_SPEED_HIGH:
|
||||
case USB_SPEED_SUPER:
|
||||
case USB_SPEED_SUPER_PLUS:
|
||||
break;
|
||||
default:
|
||||
dev_err(dev, "invalid max_speed: %s\n",
|
||||
usb_speed_string(mtu->max_speed));
|
||||
/* fall through */
|
||||
case USB_SPEED_UNKNOWN:
|
||||
/* default as SS */
|
||||
mtu->max_speed = USB_SPEED_SUPER;
|
||||
/* default as SSP */
|
||||
mtu->max_speed = USB_SPEED_SUPER_PLUS;
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -89,6 +89,7 @@ static int mtu3_ep_enable(struct mtu3_ep *mep)
|
|||
|
||||
switch (mtu->g.speed) {
|
||||
case USB_SPEED_SUPER:
|
||||
case USB_SPEED_SUPER_PLUS:
|
||||
if (usb_endpoint_xfer_int(desc) ||
|
||||
usb_endpoint_xfer_isoc(desc)) {
|
||||
interval = desc->bInterval;
|
||||
|
@ -456,7 +457,7 @@ static int mtu3_gadget_wakeup(struct usb_gadget *gadget)
|
|||
return -EOPNOTSUPP;
|
||||
|
||||
spin_lock_irqsave(&mtu->lock, flags);
|
||||
if (mtu->g.speed == USB_SPEED_SUPER) {
|
||||
if (mtu->g.speed >= USB_SPEED_SUPER) {
|
||||
mtu3_setbits(mtu->mac_base, U3D_LINK_POWER_CONTROL, UX_EXIT);
|
||||
} else {
|
||||
mtu3_setbits(mtu->mac_base, U3D_POWER_MANAGEMENT, RESUME);
|
||||
|
|
|
@ -212,8 +212,8 @@ ep0_get_status(struct mtu3 *mtu, const struct usb_ctrlrequest *setup)
|
|||
case USB_RECIP_DEVICE:
|
||||
result[0] = mtu->is_self_powered << USB_DEVICE_SELF_POWERED;
|
||||
result[0] |= mtu->may_wakeup << USB_DEVICE_REMOTE_WAKEUP;
|
||||
/* superspeed only */
|
||||
if (mtu->g.speed == USB_SPEED_SUPER) {
|
||||
|
||||
if (mtu->g.speed >= USB_SPEED_SUPER) {
|
||||
result[0] |= mtu->u1_enable << USB_DEV_STAT_U1_ENABLED;
|
||||
result[0] |= mtu->u2_enable << USB_DEV_STAT_U2_ENABLED;
|
||||
}
|
||||
|
@ -329,8 +329,8 @@ static int ep0_handle_feature_dev(struct mtu3 *mtu,
|
|||
handled = handle_test_mode(mtu, setup);
|
||||
break;
|
||||
case USB_DEVICE_U1_ENABLE:
|
||||
if (mtu->g.speed != USB_SPEED_SUPER ||
|
||||
mtu->g.state != USB_STATE_CONFIGURED)
|
||||
if (mtu->g.speed < USB_SPEED_SUPER ||
|
||||
mtu->g.state != USB_STATE_CONFIGURED)
|
||||
break;
|
||||
|
||||
lpc = mtu3_readl(mbase, U3D_LINK_POWER_CONTROL);
|
||||
|
@ -344,8 +344,8 @@ static int ep0_handle_feature_dev(struct mtu3 *mtu,
|
|||
handled = 1;
|
||||
break;
|
||||
case USB_DEVICE_U2_ENABLE:
|
||||
if (mtu->g.speed != USB_SPEED_SUPER ||
|
||||
mtu->g.state != USB_STATE_CONFIGURED)
|
||||
if (mtu->g.speed < USB_SPEED_SUPER ||
|
||||
mtu->g.state != USB_STATE_CONFIGURED)
|
||||
break;
|
||||
|
||||
lpc = mtu3_readl(mbase, U3D_LINK_POWER_CONTROL);
|
||||
|
@ -384,8 +384,8 @@ static int ep0_handle_feature(struct mtu3 *mtu,
|
|||
break;
|
||||
case USB_RECIP_INTERFACE:
|
||||
/* superspeed only */
|
||||
if ((value == USB_INTRF_FUNC_SUSPEND)
|
||||
&& (mtu->g.speed == USB_SPEED_SUPER)) {
|
||||
if (value == USB_INTRF_FUNC_SUSPEND &&
|
||||
mtu->g.speed >= USB_SPEED_SUPER) {
|
||||
/*
|
||||
* forward the request because function drivers
|
||||
* should handle it
|
||||
|
|
|
@ -467,6 +467,7 @@
|
|||
#define SSUSB_VBUS_CHG_INT_B_EN BIT(6)
|
||||
|
||||
/* U3D_SSUSB_U3_CTRL_0P */
|
||||
#define SSUSB_U3_PORT_SSP_SPEED BIT(9)
|
||||
#define SSUSB_U3_PORT_HOST_SEL BIT(2)
|
||||
#define SSUSB_U3_PORT_PDN BIT(1)
|
||||
#define SSUSB_U3_PORT_DIS BIT(0)
|
||||
|
|
Loading…
Reference in New Issue