All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/4] the fix for the USB HOST1 at rk3288 platform
@ 2016-09-08 14:27 ` Randy Li
  0 siblings, 0 replies; 10+ messages in thread
From: Randy Li @ 2016-09-08 14:27 UTC (permalink / raw)
  To: linux-usb-u79uwXL29TY76Z2rM5mHXA
  Cc: John.Youn-HKixBCOQz3hWk0Htik3J/w, kishon-l0cyMroinI0,
	felipe.balbi-VuQAYsv1563Yd54FQh9/CA, mark.rutland-5wv7dgnIgG8,
	devicetree-u79uwXL29TY76Z2rM5mHXA, heiko-4mtYJXux2i+zQB+pC5nmwQ,
	gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A, randy.li-TNX95d0MmH7DzftRWevZcw,
	Randy Li

  At this stage it is the only "full features" and well verified 
USB EHCI controller in this platform. More review is always necessary.

Changelog:
 - v7:
    adding a wrapper for the reset operation for phy
    using that wrapper
 - v6:
    move pwms pinctrl to pwms node
    fix the order of the dtb file in Makefile
 - v5:
   - correct the mail format
 - v4:
   - re-order some nodes in alphabetical order
   - fix some minor bugs
   - add a entry in vendor list
 - v3:
   - fixing the rtc clock, using clock source from PMIC
   - enable the tmu
   - enable the fimc for elite board
   - suuport the audio codec at elite board
   - fixing minor bugs in the last commit
 - v2:
   - removing rtc node
     the clock source driver is not done yet.
   - adding exynos-bus
   - fixing the MFC

Randy Li (4):
  phy: Add reset callback
  phy: rockchip-usb: use rockchip_usb_phy_reset to reset phy during
    wakeup
  usb: dwc2: assert phy reset when waking up in rk3288 platform
  ARM: dts: rockchip: Point rk3288 dwc2 usb at the full PHY reset

 .../devicetree/bindings/phy/rockchip-usb-phy.txt     |  3 +++
 arch/arm/boot/dts/rk3288.dtsi                        |  4 ++++
 drivers/phy/phy-core.c                               | 14 ++++++++++++++
 drivers/phy/phy-rockchip-usb.c                       | 20 ++++++++++++++++++++
 drivers/usb/dwc2/core_intr.c                         | 11 +++++++++++
 include/linux/phy/phy.h                              |  3 +++
 6 files changed, 55 insertions(+)

-- 
2.7.4

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 10+ messages in thread
* Re: [PATCH 3/4] usb: dwc2: assert phy reset when waking up in rk3288 platform
@ 2016-08-20 21:30 Sergei Shtylyov
  2016-08-21  7:56 ` [PATCH 0/4 v5] usb: dwc2: fix the usb host for host port at RK32 Randy Li
  0 siblings, 1 reply; 10+ messages in thread
From: Sergei Shtylyov @ 2016-08-20 21:30 UTC (permalink / raw)
  To: Randy Li, linux-usb
  Cc: johnyoun, gregkh, robh+dt, mark.rutland, devicetree, eddie.cai,
	randy.li, kishon, linux-kernel, heiko

Hello.

On 08/20/2016 11:32 PM, Randy Li wrote:

> On the rk3288 USB host-only port (the one that's not the OTG-enabled
> port) the PHY can get into a bad state when a wakeup is asserted (not
> just a wakeup from full system suspend but also a wakeup from
> autosuspend).
>
> We can get the PHY out of its bad state by asserting its "port reset",
> but unfortunately that seems to assert a reset onto the USB bus so it
> could confuse things if we don't actually deenumerate / reenumerate the
> device.
>
> We can also get the PHY out of its bad state by fully resetting it using
> the reset from the CRU (clock reset unit) in chip, which does a more full
> reset.  The CRU-based reset appears to actually cause devices on the bus
> to be removed and reinserted, which fixes the problem (albeit in a hacky
> way).
>
> It's unfortunate that we need to do a full re-enumeration of devices at
> wakeup time, but this is better than alternative of letting the bus get
> wedged.
>
> The original patches came from Doug Anderson <dianders@chromium.org>.
>
> Signed-off-by: Randy Li <ayaka@soulik.info>
> ---
>  drivers/usb/dwc2/core_intr.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
>
> diff --git a/drivers/usb/dwc2/core_intr.c b/drivers/usb/dwc2/core_intr.c
> index d85c5c9..c31c3fe 100644
> --- a/drivers/usb/dwc2/core_intr.c
> +++ b/drivers/usb/dwc2/core_intr.c
[...]
> @@ -379,6 +380,14 @@ static void dwc2_handle_wakeup_detected_intr(struct dwc2_hsotg *hsotg)
>  			/* Restart the Phy Clock */
>  			pcgcctl &= ~PCGCTL_STOPPCLK;
>  			dwc2_writel(pcgcctl, hsotg->regs + PCGCTL);
> +
> +			/* It is a quirk in Rockchip RK3288, causing by
> +			 * a hardware bug. This will propagate out and
> +			 * eventually we'll re-enumerate the device.
> +			 * Not great but the best we can do */

   The preferred multi-line comment style is this:

/*
  * bla
  * bla
  */

    Yours is close. :-)

[...]

MBR, Sergei

^ permalink raw reply	[flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] usb: dwc2: optionally assert phy "full reset" when waking up
@ 2016-08-16  2:33 John Youn
  2016-08-20 20:32 ` [PATCH 0/4 v4] usb: dwc2: fix the usb host for host port at RK32 Randy Li
  0 siblings, 1 reply; 10+ messages in thread
From: John Youn @ 2016-08-16  2:33 UTC (permalink / raw)
  To: Randy Li, John Youn,
	linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
  Cc: gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
	mark.rutland-5wv7dgnIgG8@public.gmane.org,
	devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	ayaka-xPW3/0Ywev/iB9QmIjCX8w@public.gmane.org,
	eddie.cai-TNX95d0MmH7DzftRWevZcw@public.gmane.org

On 8/15/2016 6:11 PM, Randy Li wrote:
> 
> 
> On 08/16/2016 06:19 AM, John Youn wrote:
>> On 7/19/2016 5:06 AM, Randy Li wrote:
>>> From: Doug Anderson <dianders-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
>>>
>>> On the rk3288 USB host-only port (the one that's not the OTG-enabled
>>> port) the PHY can get into a bad state when a wakeup is asserted (not
>>> just a wakeup from full system suspend but also a wakeup from
>>> autosuspend). The problem is caused by a design fault in IC, Rockchip
>>> have confirmed it and fix this problem in the future IC model.
>>>
>>> We can get the PHY out of its bad state by asserting its "port reset",
>>> but unfortunately that seems to assert a reset onto the USB bus so it
>>> could confuse things if we don't actually deenumerate / reenumerate the
>>> device.
>>>
>>> We can also get the PHY out of its bad state by fully resetting it using
>>> the reset from the CRU (clock reset unit), which does a more full
>>> reset.  The CRU-based reset appears to actually cause devices on the bus
>>> to be removed and reinserted, which fixes the problem (albeit in a hacky
>>> way).
>>>
>>> It's unfortunate that we need to do a full re-enumeration of devices at
>>> wakeup time, but this is better than alternative of letting the bus get
>>> wedged.
>>>
>>> Signed-off-by: Douglas Anderson <dianders-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
>>> Signed-off-by: Yunzhi Li <lyz-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
>>> Reviewed-by: Randy Li <randy.li-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
>>> ---
>>>  Documentation/devicetree/bindings/usb/dwc2.txt |  7 +++++++
>>>  drivers/usb/dwc2/core.h                        |  5 +++++
>>>  drivers/usb/dwc2/core_intr.c                   | 14 ++++++++++++++
>>>  drivers/usb/dwc2/platform.c                    | 13 +++++++++++++
>>>  4 files changed, 39 insertions(+)
>>>
>>> diff --git a/Documentation/devicetree/bindings/usb/dwc2.txt b/Documentation/devicetree/bindings/usb/dwc2.txt
>>> index 20a68bf..40c63ae 100644
>>> --- a/Documentation/devicetree/bindings/usb/dwc2.txt
>>> +++ b/Documentation/devicetree/bindings/usb/dwc2.txt
>>> @@ -20,6 +20,13 @@ Refer to clk/clock-bindings.txt for generic clock consumer properties
>>>  Optional properties:
>>>  - phys: phy provider specifier
>>>  - phy-names: shall be "usb2-phy"
>>> +- snps,need-phy-full-reset-on-wake: if present indicates that we need to reset
>>> +  the PHY when we detect a wakeup due to a hardware errata.  If present you
>>> +  must specify a "phy-full-reset" reset.
>>> +
>>> +Resets:
>>> +- phy-full-reset (optional): Fully resets the PHY (Only used by rk3288 Soc).
>>> +
>>>  Refer to phy/phy-bindings.txt for generic phy consumer properties
>>>  - dr_mode: shall be one of "host", "peripheral" and "otg"
>>>    Refer to usb/generic.txt
>>> diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h
>>> index dec0b21..951abe0 100644
>>> --- a/drivers/usb/dwc2/core.h
>>> +++ b/drivers/usb/dwc2/core.h
>>> @@ -719,8 +719,11 @@ struct dwc2_hregs_backup {
>>>   * @hcd_enabled		Host mode sub-driver initialization indicator.
>>>   * @gadget_enabled	Peripheral mode sub-driver initialization indicator.
>>>   * @ll_hw_enabled	Status of low-level hardware resources.
>>> + * @need_phy_full_reset_on_wake: Quirk saying that we should assert
>>> + *                               phy_full_reset on a remote wakeup.
>>>   * @phy:                The otg phy transceiver structure for phy control.
>>>   * @uphy:               The otg phy transceiver structure for old USB phy control.
>>> + * @phy_full_reset:     Reset control for the PHY's "full reset".
>>>   * @plat:               The platform specific configuration data. This can be removed once
>>>   *                      all SoCs support usb transceiver.
>>>   * @supplies:           Definition of USB power supplies
>>> @@ -853,9 +856,11 @@ struct dwc2_hsotg {
>>>  	unsigned int hcd_enabled:1;
>>>  	unsigned int gadget_enabled:1;
>>>  	unsigned int ll_hw_enabled:1;
>>> +	unsigned int need_phy_full_reset_on_wake:1;
>>>
>>>  	struct phy *phy;
>>>  	struct usb_phy *uphy;
>>> +	struct reset_control *phy_full_reset;
>>>  	struct dwc2_hsotg_plat *plat;
>>>  	struct regulator_bulk_data supplies[ARRAY_SIZE(dwc2_hsotg_supply_names)];
>>>  	u32 phyif;
>>> diff --git a/drivers/usb/dwc2/core_intr.c b/drivers/usb/dwc2/core_intr.c
>>> index d85c5c9..53d8327 100644
>>> --- a/drivers/usb/dwc2/core_intr.c
>>> +++ b/drivers/usb/dwc2/core_intr.c
>>> @@ -45,6 +45,7 @@
>>>  #include <linux/dma-mapping.h>
>>>  #include <linux/io.h>
>>>  #include <linux/slab.h>
>>> +#include <linux/reset.h>
>>>  #include <linux/usb.h>
>>>
>>>  #include <linux/usb/hcd.h>
>>> @@ -379,6 +380,19 @@ static void dwc2_handle_wakeup_detected_intr(struct dwc2_hsotg *hsotg)
>>>  			/* Restart the Phy Clock */
>>>  			pcgcctl &= ~PCGCTL_STOPPCLK;
>>>  			dwc2_writel(pcgcctl, hsotg->regs + PCGCTL);
>>> +
>>> +			/*
>>> +			 * If we've got this quirk then the PHY is stuck upon
>>> +			 * wakeup.  Assert reset.  This will propagate out and
>>> +			 * eventually we'll re-enumerate the device.  Not great
>>> +			 * but the best we can do.
>>> +			 */
>>> +			if (hsotg->need_phy_full_reset_on_wake) {
>>> +				reset_control_assert(hsotg->phy_full_reset);
>>> +				udelay(50);
>>> +				reset_control_deassert(hsotg->phy_full_reset);
>>> +			}
>>> +
>>>  			mod_timer(&hsotg->wkp_timer,
>>>  				  jiffies + msecs_to_jiffies(71));
>>>  		} else {
>>> diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c
>>> index fc6f525..d8894a1 100644
>>> --- a/drivers/usb/dwc2/platform.c
>>> +++ b/drivers/usb/dwc2/platform.c
>>> @@ -45,6 +45,7 @@
>>>  #include <linux/platform_device.h>
>>>  #include <linux/phy/phy.h>
>>>  #include <linux/platform_data/s3c-hsotg.h>
>>> +#include <linux/reset.h>
>>>
>>>  #include <linux/usb/of.h>
>>>
>>> @@ -529,6 +530,18 @@ static int dwc2_driver_probe(struct platform_device *dev)
>>>  	dev_dbg(&dev->dev, "mapped PA %08lx to VA %p\n",
>>>  		(unsigned long)res->start, hsotg->regs);
>>>
>>> +	hsotg->need_phy_full_reset_on_wake =
>>> +		of_property_read_bool(dev->dev.of_node,
>>> +				"snps,need-phy-full-reset-on-wake");
>>> +	hsotg->phy_full_reset = devm_reset_control_get(hsotg->dev,
>>> +				"phy-full-reset");
>>> +	if (IS_ERR(hsotg->phy_full_reset) &&
>>> +			hsotg->need_phy_full_reset_on_wake) {
>>
>> Should use the devm_reset_control_get_optional() variant so that we
>> can check whether it is a legitimate error, or the PHY is not
>> specified or !CONFIG_OF.
> I see.

Just a correction, I meant in case the reset controller is unspecified
or !CONFIG_RESET_CONTROLLER.

>>
>>> +		dev_warn(hsotg->dev, "Missing phy full reset (%ld); skipping\n",
>>> +				PTR_ERR(hsotg->phy_full_reset));
>>> +		hsotg->need_phy_full_reset_on_wake = false;
>>> +	}
>>> +
>>
>> Also this code can go into the dwc2_lowlevel_hw_init() function so as
>> not to clutter up the probe() function futher.
>>
>> A similar patch adding a reset was submitted by Dinh which you can use
>> as a reference:
>>
>> http://marc.info/?l=linux-usb&m=147085447403019&w=2
> 
> I am a little busy recently, but I would submit a new version in this week.

Ok sure.

Regards,
John
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2016-09-08 18:09 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-09-08 14:27 [PATCH 0/4] the fix for the USB HOST1 at rk3288 platform Randy Li
2016-09-08 14:27 ` Randy Li
2016-09-08 14:27 ` [PATCH 1/4] phy: Add reset callback Randy Li
2016-09-08 15:30   ` Heiko Stuebner
2016-09-08 14:27 ` [PATCH 2/4] phy: rockchip-usb: use rockchip_usb_phy_reset to reset phy during wakeup Randy Li
2016-09-08 14:27 ` [PATCH 3/4] usb: dwc2: assert phy reset when waking up in rk3288 platform Randy Li
2016-09-08 18:09   ` John Youn
2016-09-08 14:27 ` [PATCH 4/4] ARM: dts: rockchip: Point rk3288 dwc2 usb at the full PHY reset Randy Li
  -- strict thread matches above, loose matches on Subject: below --
2016-08-20 21:30 [PATCH 3/4] usb: dwc2: assert phy reset when waking up in rk3288 platform Sergei Shtylyov
2016-08-21  7:56 ` [PATCH 0/4 v5] usb: dwc2: fix the usb host for host port at RK32 Randy Li
2016-08-21  7:56   ` [PATCH 1/4] phy: Add reset callback Randy Li
2016-08-16  2:33 [PATCH 1/2] usb: dwc2: optionally assert phy "full reset" when waking up John Youn
2016-08-20 20:32 ` [PATCH 0/4 v4] usb: dwc2: fix the usb host for host port at RK32 Randy Li
2016-08-20 20:32   ` [PATCH 1/4] phy: Add reset callback Randy Li

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.