Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1740607 > unrolled thread
| Started by | Chunfeng Yun <chunfeng.yun@mediatek.com> |
|---|---|
| First post | 2017-09-27 13:00 +0200 |
| Last post | 2017-09-29 16:20 +0200 |
| Articles | 2 — 1 participant |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
[PATCH 07/12] usb: mtu3: add support for usb3.1 IP Chunfeng Yun <chunfeng.yun@mediatek.com> - 2017-09-27 13:00 +0200
Re: [PATCH 07/12] usb: mtu3: add support for usb3.1 IP Chunfeng Yun <chunfeng.yun@mediatek.com> - 2017-09-29 16:20 +0200
| From | Chunfeng Yun <chunfeng.yun@mediatek.com> |
|---|---|
| Date | 2017-09-27 13:00 +0200 |
| Subject | [PATCH 07/12] usb: mtu3: add support for usb3.1 IP |
| Message-ID | <uuiel-1ki-3@gated-at.bofh.it> |
Support SuperSpeedPlus for usb3.1 device IP
Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
---
drivers/usb/mtu3/mtu3.h | 1 +
drivers/usb/mtu3/mtu3_core.c | 14 +++++++++++---
drivers/usb/mtu3/mtu3_gadget.c | 3 ++-
drivers/usb/mtu3/mtu3_gadget_ep0.c | 16 ++++++++--------
drivers/usb/mtu3/mtu3_hw_regs.h | 1 +
5 files changed, 23 insertions(+), 12 deletions(-)
diff --git a/drivers/usb/mtu3/mtu3.h b/drivers/usb/mtu3/mtu3.h
index b0c2b5d..d80e4e8 100644
--- a/drivers/usb/mtu3/mtu3.h
+++ b/drivers/usb/mtu3/mtu3.h
@@ -94,6 +94,7 @@ enum mtu3_speed {
MTU3_SPEED_FULL = 1,
MTU3_SPEED_HIGH = 3,
MTU3_SPEED_SUPER = 4,
+ MTU3_SPEED_SUPER_PLUS = 5,
};
/**
diff --git a/drivers/usb/mtu3/mtu3_core.c b/drivers/usb/mtu3/mtu3_core.c
index cd4528f..67f7a30 100644
--- a/drivers/usb/mtu3/mtu3_core.c
+++ b/drivers/usb/mtu3/mtu3_core.c
@@ -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;
}
diff --git a/drivers/usb/mtu3/mtu3_gadget.c b/drivers/usb/mtu3/mtu3_gadget.c
index 434fca5..b495471 100644
--- a/drivers/usb/mtu3/mtu3_gadget.c
+++ b/drivers/usb/mtu3/mtu3_gadget.c
@@ -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);
diff --git a/drivers/usb/mtu3/mtu3_gadget_ep0.c b/drivers/usb/mtu3/mtu3_gadget_ep0.c
index 958d74d..1ca77e8 100644
--- a/drivers/usb/mtu3/mtu3_gadget_ep0.c
+++ b/drivers/usb/mtu3/mtu3_gadget_ep0.c
@@ -212,8 +212,8 @@ static int ep0_set_sel(struct mtu3 *mtu, 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
diff --git a/drivers/usb/mtu3/mtu3_hw_regs.h b/drivers/usb/mtu3/mtu3_hw_regs.h
index a7e35f6..6953436 100644
--- a/drivers/usb/mtu3/mtu3_hw_regs.h
+++ b/drivers/usb/mtu3/mtu3_hw_regs.h
@@ -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)
--
1.7.9.5
[toc] | [next] | [standalone]
| From | Chunfeng Yun <chunfeng.yun@mediatek.com> |
|---|---|
| Date | 2017-09-29 16:20 +0200 |
| Message-ID | <uv4iZ-7eW-3@gated-at.bofh.it> |
| In reply to | #1740607 |
On Thu, 2017-09-28 at 08:17 +0800, Chunfeng Yun wrote:
> Support SuperSpeedPlus for usb3.1 device IP
>
> Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
> ---
> drivers/usb/mtu3/mtu3.h | 1 +
> drivers/usb/mtu3/mtu3_core.c | 14 +++++++++++---
> drivers/usb/mtu3/mtu3_gadget.c | 3 ++-
> drivers/usb/mtu3/mtu3_gadget_ep0.c | 16 ++++++++--------
> drivers/usb/mtu3/mtu3_hw_regs.h | 1 +
> 5 files changed, 23 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/usb/mtu3/mtu3.h b/drivers/usb/mtu3/mtu3.h
> index b0c2b5d..d80e4e8 100644
> --- a/drivers/usb/mtu3/mtu3.h
> +++ b/drivers/usb/mtu3/mtu3.h
> @@ -94,6 +94,7 @@ enum mtu3_speed {
> MTU3_SPEED_FULL = 1,
> MTU3_SPEED_HIGH = 3,
> MTU3_SPEED_SUPER = 4,
> + MTU3_SPEED_SUPER_PLUS = 5,
> };
>
> /**
> diff --git a/drivers/usb/mtu3/mtu3_core.c b/drivers/usb/mtu3/mtu3_core.c
> index cd4528f..67f7a30 100644
> --- a/drivers/usb/mtu3/mtu3_core.c
> +++ b/drivers/usb/mtu3/mtu3_core.c
> @@ -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;
> }
>
> diff --git a/drivers/usb/mtu3/mtu3_gadget.c b/drivers/usb/mtu3/mtu3_gadget.c
> index 434fca5..b495471 100644
> --- a/drivers/usb/mtu3/mtu3_gadget.c
> +++ b/drivers/usb/mtu3/mtu3_gadget.c
> @@ -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);
> diff --git a/drivers/usb/mtu3/mtu3_gadget_ep0.c b/drivers/usb/mtu3/mtu3_gadget_ep0.c
> index 958d74d..1ca77e8 100644
> --- a/drivers/usb/mtu3/mtu3_gadget_ep0.c
> +++ b/drivers/usb/mtu3/mtu3_gadget_ep0.c
> @@ -212,8 +212,8 @@ static int ep0_set_sel(struct mtu3 *mtu, 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 ||
Here is wrong, I'll fix it up in next version.
> + 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 ||
It's also wrong.
Sorry
> + 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
> diff --git a/drivers/usb/mtu3/mtu3_hw_regs.h b/drivers/usb/mtu3/mtu3_hw_regs.h
> index a7e35f6..6953436 100644
> --- a/drivers/usb/mtu3/mtu3_hw_regs.h
> +++ b/drivers/usb/mtu3/mtu3_hw_regs.h
> @@ -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)
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web