All of lore.kernel.org
 help / color / mirror / Atom feed
From: balbi@kernel.org (Felipe Balbi)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] usb: host: xhci-plat: Make enum xhci_plat_type start at a non zero value
Date: Sat, 26 Mar 2016 12:10:39 +0200	[thread overview]
Message-ID: <87fuvd8s80.fsf@ti.com> (raw)
In-Reply-To: <20160326091050.GA7793@griffinp-ThinkPad-X1-Carbon-2nd>


Hi,

Peter Griffin <peter.griffin@linaro.org> writes:
> Hi Felipe,
>
> On Fri, 25 Mar 2016, Felipe Balbi wrote:
>
>> 
>> Hi,
>> 
>> Gregory CLEMENT <gregory.clement@free-electrons.com> writes:
>> >> Peter Griffin <peter.griffin@linaro.org> writes:
>> >>> Otherwise generic-xhci and xhci-platform which have no data get wrongly
>> >>> detected as XHCI_PLAT_TYPE_MARVELL_ARMADA by xhci_plat_type_is().
>> >>>
>> >>> This fixes a regression in v4.5 for STiH407 family SoC's which use the
>> >>> synopsis dwc3 IP, whereby the disable_clk error path gets taken due to
>> >>> wrongly being detected as XHCI_PLAT_TYPE_MARVELL_ARMADA and the hcd never
>> >>> gets added.
>> >>>
>> >>> I suspect this will also fix other dwc3 DT platforms such as Exynos,
>> >>> although I've only tested on STih410 SoC.
>> >>>
>> >>> Fixes: 4efb2f694114 ("usb: host: xhci-plat: add struct xhci_plat_priv")
>> >>> Cc: stable at vger.kernel.org
>> >>> Cc: gregory.clement at free-electrons.com
>> >>> Cc: yoshihiro.shimoda.uh at renesas.com
>> >>> Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
>> >>> ---
>> >>>  drivers/usb/host/xhci-plat.h | 2 +-
>> >>>  1 file changed, 1 insertion(+), 1 deletion(-)
>> >>>
>> >>> diff --git a/drivers/usb/host/xhci-plat.h b/drivers/usb/host/xhci-plat.h
>> >>> index 5a2e2e3..529c3c4 100644
>> >>> --- a/drivers/usb/host/xhci-plat.h
>> >>> +++ b/drivers/usb/host/xhci-plat.h
>> >>> @@ -14,7 +14,7 @@
>> >>>  #include "xhci.h"	/* for hcd_to_xhci() */
>> >>>  
>> >>>  enum xhci_plat_type {
>> >>> -	XHCI_PLAT_TYPE_MARVELL_ARMADA,
>> >>> +	XHCI_PLAT_TYPE_MARVELL_ARMADA = 1,
>> >>>  	XHCI_PLAT_TYPE_RENESAS_RCAR_GEN2,
>> >>>  	XHCI_PLAT_TYPE_RENESAS_RCAR_GEN3,
>> >>
>> >> aren't these platforms using device tree ? Why aren't these just
>> >> different compatible strings ?
>> >
>> > According to 4efb2f69411456d35051e9047c15157c9a5ba217 "usb: host:
>> > xhci-plat: add struct xhci_plat_priv" :
>> >
>> > This patch adds struct xhci_plat_priv to simplify the code to match
>> > platform specific variables. For now, this patch adds a member "type" in
>> > the structure
>> 
>> that's fine but the answer doesn't exactly match my question ;-)
>> 
>> My point is that this enum shouldn't be necessary at all. We have
>> compatible flags to make these checks instead. How about below ?
>> (untested, uncompiled, yada yada yada). Note that we DON'T need this
>> xhci_plat_type trickery, just need to be a little bit smarter about how
>> we use driver_data:
>
> Your solution certainly looks more elegant.

cool thanks. Now that I think about this more carefully, we might wanna
take $subject anyway for the -rc and get my version applied for v4.7
merge window. What do you think ?

>> diff --git a/drivers/usb/host/xhci-mvebu.c b/drivers/usb/host/xhci-mvebu.c
>> index 1eefc988192d..1ea6c18b74f3 100644
>> --- a/drivers/usb/host/xhci-mvebu.c
>> +++ b/drivers/usb/host/xhci-mvebu.c
>> @@ -41,8 +41,9 @@ static void xhci_mvebu_mbus_config(void __iomem *base,
>>  	}
>>  }
>>  
>> -int xhci_mvebu_mbus_init_quirk(struct platform_device *pdev)
>> +int xhci_mvebu_mbus_init_quirk(struct usb_hcd *hcd)
>>  {
>> +	struct platform_device *pdev = to_platform_device(hcd->self.controller);
>>  	struct resource	*res;
>>  	void __iomem *base;
>>  	const struct mbus_dram_target_info *dram;
>> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
>> index 5c15e9bc5f7a..adb77c60a9ae 100644
>> --- a/drivers/usb/host/xhci-plat.c
>> +++ b/drivers/usb/host/xhci-plat.c
>> @@ -47,43 +47,56 @@ static void xhci_plat_quirks(struct device *dev, struct xhci_hcd *xhci)
>>  	xhci->quirks |= XHCI_PLAT;
>>  }
>>  
>> +static void xhci_priv_plat_start(struct usb_hcd *hcd)
>> +{
>> +	struct xhci_plat_priv *priv = hcd_to_xhci_priv(hcd);
>> +
>> +	if (priv->plat_start)
>> +		priv->plat_start(hcd);
>> +}
>> +
>> +static int xhci_priv_init_quirk(struct usb_hcd *hcd)
>> +{
>> +	struct xhci_plat_priv *priv = hcd_to_xhci_priv(hcd);
>> +
>> +	if (!priv->init_quirk)
>> +		return 0;
>> +
>> +	return priv->init_quirk(hcd);
>> +}
>> +
>>  /* called during probe() after chip reset completes */
>>  static int xhci_plat_setup(struct usb_hcd *hcd)
>>  {
>>  	int ret;
>>  
>> -	if (xhci_plat_type_is(hcd, XHCI_PLAT_TYPE_RENESAS_RCAR_GEN2) ||
>> -	    xhci_plat_type_is(hcd, XHCI_PLAT_TYPE_RENESAS_RCAR_GEN3)) {
>> -		ret = xhci_rcar_init_quirk(hcd);
>> -		if (ret)
>> -			return ret;
>> -	}
>> +	ret = xhci_priv_init_quirk(hcd);
>> +	if (ret)
>> +		return ret;
>>  
>>  	return xhci_gen_setup(hcd, xhci_plat_quirks);
>>  }
>>  
>>  static int xhci_plat_start(struct usb_hcd *hcd)
>>  {
>> -	if (xhci_plat_type_is(hcd, XHCI_PLAT_TYPE_RENESAS_RCAR_GEN2) ||
>> -	    xhci_plat_type_is(hcd, XHCI_PLAT_TYPE_RENESAS_RCAR_GEN3))
>> -		xhci_rcar_start(hcd);
>> -
>> +	xhci_priv_plat_start(hcd);
>>  	return xhci_run(hcd);
>>  }
>>  
>>  #ifdef CONFIG_OF
>>  static const struct xhci_plat_priv xhci_plat_marvell_armada = {
>> -	.type = XHCI_PLAT_TYPE_MARVELL_ARMADA,
>> +	.init_quirk = xhci_mvebu_mbus_init_quirk,
>>  };
>>  
>>  static const struct xhci_plat_priv xhci_plat_renesas_rcar_gen2 = {
>> -	.type = XHCI_PLAT_TYPE_RENESAS_RCAR_GEN2,
>>  	.firmware_name = XHCI_RCAR_FIRMWARE_NAME_V1,
>> +	.init_quirk = xhci_rcar_init_quirk,
>>  };
>>  
>>  static const struct xhci_plat_priv xhci_plat_renesas_rcar_gen3 = {
>> -	.type = XHCI_PLAT_TYPE_RENESAS_RCAR_GEN3,
>>  	.firmware_name = XHCI_RCAR_FIRMWARE_NAME_V2,
>> +	.init_quirk = xhci_rcar_init_quirk,
>> +	.plat_start = xhci_rcar_start,
>>  };
>>  
>>  static const struct of_device_id usb_xhci_of_match[] = {
>> diff --git a/drivers/usb/host/xhci-plat.h b/drivers/usb/host/xhci-plat.h
>> index 5a2e2e3936c4..c4d565980832 100644
>> --- a/drivers/usb/host/xhci-plat.h
>> +++ b/drivers/usb/host/xhci-plat.h
>> @@ -13,27 +13,13 @@
>>  
>>  #include "xhci.h"	/* for hcd_to_xhci() */
>>  
>> -enum xhci_plat_type {
>> -	XHCI_PLAT_TYPE_MARVELL_ARMADA,
>> -	XHCI_PLAT_TYPE_RENESAS_RCAR_GEN2,
>> -	XHCI_PLAT_TYPE_RENESAS_RCAR_GEN3,
>> -};
>> -
>>  struct xhci_plat_priv {
>>  	enum xhci_plat_type type;
>>  	const char *firmware_name;
>> +	void (*plat_start)(struct usb_hcd *);
>> +	int (*init_quirk)(struct usb_hcd *);
>>  };
>>  
>>  #define hcd_to_xhci_priv(h) ((struct xhci_plat_priv *)hcd_to_xhci(h)->priv)
>>  
>> -static inline bool xhci_plat_type_is(struct usb_hcd *hcd,
>> -				     enum xhci_plat_type type)
>> -{
>> -	struct xhci_plat_priv *priv = hcd_to_xhci_priv(hcd);
>> -
>> -	if (priv && priv->type == type)
>> -		return true;
>> -	else
>> -		return false;
>> -}
>>  #endif	/* _XHCI_PLAT_H */
>> 
>> ps: there might be bugs there, but it's a holiday and I really shouldn't
>> be spending time on this right now ;-)
>
> I'm also off on holiday now until Sunday 10th April... yay :-)

heh, cool :-)

>> Anyway, have fun testing. Let me know if it doesn't work.
>
> I only have access to STi platforms which were broken by this change.
> Not any of the platforms which rely on the functionality which
> was introduced (although I can't see any reason why your patch wouldn't work).
>
> Maybe Yoshihiro (on CC) could test this on the Renesas platforms and
> confirm?

sure, that would be great; then we avoid further regressions ;-)

-- 
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 818 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160326/5f3fc385/attachment-0001.sig>

WARNING: multiple messages have this Message-ID (diff)
From: Felipe Balbi <balbi@kernel.org>
To: Peter Griffin <peter.griffin@linaro.org>
Cc: Gregory CLEMENT <gregory.clement@free-electrons.com>,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, mathias.nyman@intel.com,
	gregkh@linuxfoundation.org, lee.jones@linaro.org,
	linux-usb@vger.kernel.org, maxime.coquelin@st.com,
	patrice.chotard@st.com, stable@vger.kernel.org,
	yoshihiro.shimoda.uh@renesas.com, felipe.balbi@linux.intel.com
Subject: Re: [PATCH] usb: host: xhci-plat: Make enum xhci_plat_type start at a non zero value
Date: Sat, 26 Mar 2016 12:10:39 +0200	[thread overview]
Message-ID: <87fuvd8s80.fsf@ti.com> (raw)
In-Reply-To: <20160326091050.GA7793@griffinp-ThinkPad-X1-Carbon-2nd>

[-- Attachment #1: Type: text/plain, Size: 7404 bytes --]


Hi,

Peter Griffin <peter.griffin@linaro.org> writes:
> Hi Felipe,
>
> On Fri, 25 Mar 2016, Felipe Balbi wrote:
>
>> 
>> Hi,
>> 
>> Gregory CLEMENT <gregory.clement@free-electrons.com> writes:
>> >> Peter Griffin <peter.griffin@linaro.org> writes:
>> >>> Otherwise generic-xhci and xhci-platform which have no data get wrongly
>> >>> detected as XHCI_PLAT_TYPE_MARVELL_ARMADA by xhci_plat_type_is().
>> >>>
>> >>> This fixes a regression in v4.5 for STiH407 family SoC's which use the
>> >>> synopsis dwc3 IP, whereby the disable_clk error path gets taken due to
>> >>> wrongly being detected as XHCI_PLAT_TYPE_MARVELL_ARMADA and the hcd never
>> >>> gets added.
>> >>>
>> >>> I suspect this will also fix other dwc3 DT platforms such as Exynos,
>> >>> although I've only tested on STih410 SoC.
>> >>>
>> >>> Fixes: 4efb2f694114 ("usb: host: xhci-plat: add struct xhci_plat_priv")
>> >>> Cc: stable@vger.kernel.org
>> >>> Cc: gregory.clement@free-electrons.com
>> >>> Cc: yoshihiro.shimoda.uh@renesas.com
>> >>> Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
>> >>> ---
>> >>>  drivers/usb/host/xhci-plat.h | 2 +-
>> >>>  1 file changed, 1 insertion(+), 1 deletion(-)
>> >>>
>> >>> diff --git a/drivers/usb/host/xhci-plat.h b/drivers/usb/host/xhci-plat.h
>> >>> index 5a2e2e3..529c3c4 100644
>> >>> --- a/drivers/usb/host/xhci-plat.h
>> >>> +++ b/drivers/usb/host/xhci-plat.h
>> >>> @@ -14,7 +14,7 @@
>> >>>  #include "xhci.h"	/* for hcd_to_xhci() */
>> >>>  
>> >>>  enum xhci_plat_type {
>> >>> -	XHCI_PLAT_TYPE_MARVELL_ARMADA,
>> >>> +	XHCI_PLAT_TYPE_MARVELL_ARMADA = 1,
>> >>>  	XHCI_PLAT_TYPE_RENESAS_RCAR_GEN2,
>> >>>  	XHCI_PLAT_TYPE_RENESAS_RCAR_GEN3,
>> >>
>> >> aren't these platforms using device tree ? Why aren't these just
>> >> different compatible strings ?
>> >
>> > According to 4efb2f69411456d35051e9047c15157c9a5ba217 "usb: host:
>> > xhci-plat: add struct xhci_plat_priv" :
>> >
>> > This patch adds struct xhci_plat_priv to simplify the code to match
>> > platform specific variables. For now, this patch adds a member "type" in
>> > the structure
>> 
>> that's fine but the answer doesn't exactly match my question ;-)
>> 
>> My point is that this enum shouldn't be necessary at all. We have
>> compatible flags to make these checks instead. How about below ?
>> (untested, uncompiled, yada yada yada). Note that we DON'T need this
>> xhci_plat_type trickery, just need to be a little bit smarter about how
>> we use driver_data:
>
> Your solution certainly looks more elegant.

cool thanks. Now that I think about this more carefully, we might wanna
take $subject anyway for the -rc and get my version applied for v4.7
merge window. What do you think ?

>> diff --git a/drivers/usb/host/xhci-mvebu.c b/drivers/usb/host/xhci-mvebu.c
>> index 1eefc988192d..1ea6c18b74f3 100644
>> --- a/drivers/usb/host/xhci-mvebu.c
>> +++ b/drivers/usb/host/xhci-mvebu.c
>> @@ -41,8 +41,9 @@ static void xhci_mvebu_mbus_config(void __iomem *base,
>>  	}
>>  }
>>  
>> -int xhci_mvebu_mbus_init_quirk(struct platform_device *pdev)
>> +int xhci_mvebu_mbus_init_quirk(struct usb_hcd *hcd)
>>  {
>> +	struct platform_device *pdev = to_platform_device(hcd->self.controller);
>>  	struct resource	*res;
>>  	void __iomem *base;
>>  	const struct mbus_dram_target_info *dram;
>> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
>> index 5c15e9bc5f7a..adb77c60a9ae 100644
>> --- a/drivers/usb/host/xhci-plat.c
>> +++ b/drivers/usb/host/xhci-plat.c
>> @@ -47,43 +47,56 @@ static void xhci_plat_quirks(struct device *dev, struct xhci_hcd *xhci)
>>  	xhci->quirks |= XHCI_PLAT;
>>  }
>>  
>> +static void xhci_priv_plat_start(struct usb_hcd *hcd)
>> +{
>> +	struct xhci_plat_priv *priv = hcd_to_xhci_priv(hcd);
>> +
>> +	if (priv->plat_start)
>> +		priv->plat_start(hcd);
>> +}
>> +
>> +static int xhci_priv_init_quirk(struct usb_hcd *hcd)
>> +{
>> +	struct xhci_plat_priv *priv = hcd_to_xhci_priv(hcd);
>> +
>> +	if (!priv->init_quirk)
>> +		return 0;
>> +
>> +	return priv->init_quirk(hcd);
>> +}
>> +
>>  /* called during probe() after chip reset completes */
>>  static int xhci_plat_setup(struct usb_hcd *hcd)
>>  {
>>  	int ret;
>>  
>> -	if (xhci_plat_type_is(hcd, XHCI_PLAT_TYPE_RENESAS_RCAR_GEN2) ||
>> -	    xhci_plat_type_is(hcd, XHCI_PLAT_TYPE_RENESAS_RCAR_GEN3)) {
>> -		ret = xhci_rcar_init_quirk(hcd);
>> -		if (ret)
>> -			return ret;
>> -	}
>> +	ret = xhci_priv_init_quirk(hcd);
>> +	if (ret)
>> +		return ret;
>>  
>>  	return xhci_gen_setup(hcd, xhci_plat_quirks);
>>  }
>>  
>>  static int xhci_plat_start(struct usb_hcd *hcd)
>>  {
>> -	if (xhci_plat_type_is(hcd, XHCI_PLAT_TYPE_RENESAS_RCAR_GEN2) ||
>> -	    xhci_plat_type_is(hcd, XHCI_PLAT_TYPE_RENESAS_RCAR_GEN3))
>> -		xhci_rcar_start(hcd);
>> -
>> +	xhci_priv_plat_start(hcd);
>>  	return xhci_run(hcd);
>>  }
>>  
>>  #ifdef CONFIG_OF
>>  static const struct xhci_plat_priv xhci_plat_marvell_armada = {
>> -	.type = XHCI_PLAT_TYPE_MARVELL_ARMADA,
>> +	.init_quirk = xhci_mvebu_mbus_init_quirk,
>>  };
>>  
>>  static const struct xhci_plat_priv xhci_plat_renesas_rcar_gen2 = {
>> -	.type = XHCI_PLAT_TYPE_RENESAS_RCAR_GEN2,
>>  	.firmware_name = XHCI_RCAR_FIRMWARE_NAME_V1,
>> +	.init_quirk = xhci_rcar_init_quirk,
>>  };
>>  
>>  static const struct xhci_plat_priv xhci_plat_renesas_rcar_gen3 = {
>> -	.type = XHCI_PLAT_TYPE_RENESAS_RCAR_GEN3,
>>  	.firmware_name = XHCI_RCAR_FIRMWARE_NAME_V2,
>> +	.init_quirk = xhci_rcar_init_quirk,
>> +	.plat_start = xhci_rcar_start,
>>  };
>>  
>>  static const struct of_device_id usb_xhci_of_match[] = {
>> diff --git a/drivers/usb/host/xhci-plat.h b/drivers/usb/host/xhci-plat.h
>> index 5a2e2e3936c4..c4d565980832 100644
>> --- a/drivers/usb/host/xhci-plat.h
>> +++ b/drivers/usb/host/xhci-plat.h
>> @@ -13,27 +13,13 @@
>>  
>>  #include "xhci.h"	/* for hcd_to_xhci() */
>>  
>> -enum xhci_plat_type {
>> -	XHCI_PLAT_TYPE_MARVELL_ARMADA,
>> -	XHCI_PLAT_TYPE_RENESAS_RCAR_GEN2,
>> -	XHCI_PLAT_TYPE_RENESAS_RCAR_GEN3,
>> -};
>> -
>>  struct xhci_plat_priv {
>>  	enum xhci_plat_type type;
>>  	const char *firmware_name;
>> +	void (*plat_start)(struct usb_hcd *);
>> +	int (*init_quirk)(struct usb_hcd *);
>>  };
>>  
>>  #define hcd_to_xhci_priv(h) ((struct xhci_plat_priv *)hcd_to_xhci(h)->priv)
>>  
>> -static inline bool xhci_plat_type_is(struct usb_hcd *hcd,
>> -				     enum xhci_plat_type type)
>> -{
>> -	struct xhci_plat_priv *priv = hcd_to_xhci_priv(hcd);
>> -
>> -	if (priv && priv->type == type)
>> -		return true;
>> -	else
>> -		return false;
>> -}
>>  #endif	/* _XHCI_PLAT_H */
>> 
>> ps: there might be bugs there, but it's a holiday and I really shouldn't
>> be spending time on this right now ;-)
>
> I'm also off on holiday now until Sunday 10th April... yay :-)

heh, cool :-)

>> Anyway, have fun testing. Let me know if it doesn't work.
>
> I only have access to STi platforms which were broken by this change.
> Not any of the platforms which rely on the functionality which
> was introduced (although I can't see any reason why your patch wouldn't work).
>
> Maybe Yoshihiro (on CC) could test this on the Renesas platforms and
> confirm?

sure, that would be great; then we avoid further regressions ;-)

-- 
balbi

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 818 bytes --]

  reply	other threads:[~2016-03-26 10:10 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-25 14:46 [PATCH] usb: host: xhci-plat: Make enum xhci_plat_type start at a non zero value Peter Griffin
2016-03-25 14:46 ` Peter Griffin
2016-03-25 16:58 ` Felipe Balbi
2016-03-25 16:58   ` Felipe Balbi
2016-03-25 17:07   ` Gregory CLEMENT
2016-03-25 17:07     ` Gregory CLEMENT
2016-03-25 17:44     ` Felipe Balbi
2016-03-25 17:44       ` Felipe Balbi
2016-03-26  9:10       ` Peter Griffin
2016-03-26  9:10         ` Peter Griffin
2016-03-26 10:10         ` Felipe Balbi [this message]
2016-03-26 10:10           ` Felipe Balbi
2016-03-29  9:04           ` Lee Jones
2016-03-29  9:04             ` Lee Jones
2016-03-28  6:55         ` Yoshihiro Shimoda
2016-03-28  6:55           ` Yoshihiro Shimoda
2016-03-28  8:30           ` Felipe Balbi
2016-03-28  8:30             ` Felipe Balbi
2016-03-28 10:01             ` Yoshihiro Shimoda
2016-03-28 10:01               ` Yoshihiro Shimoda
2016-04-11 15:44 ` Peter Griffin
2016-04-11 15:44   ` Peter Griffin
2016-04-13 17:00   ` Mathias Nyman
2016-04-13 17:00     ` Mathias Nyman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87fuvd8s80.fsf@ti.com \
    --to=balbi@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.