Re: [PATCH] usb: chipidea: udc: add maximum-speed = full-speed option

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Jan 28, 2014 at 04:28:44PM +0100, Michael Grzeschik wrote:
> This patch makes it possible to set the chipidea udc into full-speed only mode.
> It is set by the oftree property "maximum-speed = full-speed".
> 
> Signed-off-by: Michael Grzeschik <m.grzeschik@xxxxxxxxxxxxxx>
> Signed-off-by: Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx>
> ---
>  Documentation/devicetree/bindings/usb/ci-hdrc-imx.txt |  2 ++
>  drivers/usb/chipidea/bits.h                           |  2 ++
>  drivers/usb/chipidea/core.c                           | 11 +++++++++++
>  include/linux/usb/chipidea.h                          |  1 +
>  4 files changed, 16 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/usb/ci-hdrc-imx.txt b/Documentation/devicetree/bindings/usb/ci-hdrc-imx.txt
> index b4b5b79..a6a32cb 100644
> --- a/Documentation/devicetree/bindings/usb/ci-hdrc-imx.txt
> +++ b/Documentation/devicetree/bindings/usb/ci-hdrc-imx.txt
> @@ -18,6 +18,7 @@ Optional properties:
>  - vbus-supply: regulator for vbus
>  - disable-over-current: disable over current detect
>  - external-vbus-divider: enables off-chip resistor divider for Vbus
> +- maximum-speed: limit the maximum connection speed to "full-speed".
>  
>  Examples:
>  usb@02184000 { /* USB OTG */
> @@ -28,4 +29,5 @@ usb@02184000 { /* USB OTG */
>  	fsl,usbmisc = <&usbmisc 0>;
>  	disable-over-current;
>  	external-vbus-divider;
> +	maximum-speed = "full-speed";
>  };
> diff --git a/drivers/usb/chipidea/bits.h b/drivers/usb/chipidea/bits.h
> index a857131..83d06c1 100644
> --- a/drivers/usb/chipidea/bits.h
> +++ b/drivers/usb/chipidea/bits.h
> @@ -50,12 +50,14 @@
>  #define PORTSC_PTC            (0x0FUL << 16)
>  #define PORTSC_PHCD(d)	      ((d) ? BIT(22) : BIT(23))
>  /* PTS and PTW for non lpm version only */
> +#define PORTSC_PFSC           BIT(24)
>  #define PORTSC_PTS(d)						\
>  	(u32)((((d) & 0x3) << 30) | (((d) & 0x4) ? BIT(25) : 0))
>  #define PORTSC_PTW            BIT(28)
>  #define PORTSC_STS            BIT(29)
>  
>  /* DEVLC */
> +#define DEVLC_PFSC            BIT(23)
>  #define DEVLC_PSPD            (0x03UL << 25)
>  #define DEVLC_PSPD_HS         (0x02UL << 25)
>  #define DEVLC_PTW             BIT(27)
> diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
> index 33f22bc..e813bf1 100644
> --- a/drivers/usb/chipidea/core.c
> +++ b/drivers/usb/chipidea/core.c
> @@ -64,6 +64,7 @@
>  #include <linux/usb/otg.h>
>  #include <linux/usb/chipidea.h>
>  #include <linux/usb/of.h>
> +#include <linux/of.h>
>  #include <linux/phy.h>
>  #include <linux/regulator/consumer.h>
>  
> @@ -298,6 +299,13 @@ int hw_device_reset(struct ci_hdrc *ci, u32 mode)
>  	if (ci->platdata->flags & CI_HDRC_DISABLE_STREAMING)
>  		hw_write(ci, OP_USBMODE, USBMODE_CI_SDIS, USBMODE_CI_SDIS);
>  
> +	if (ci->platdata->flags & CI_HDRC_FORCE_FULLSPEED) {
> +		if (ci->hw_bank.lpm)
> +			hw_write(ci, OP_DEVLC, DEVLC_PFSC, DEVLC_PFSC);
> +		else
> +			hw_write(ci, OP_PORTSC, PORTSC_PFSC, PORTSC_PFSC);
> +	}
> +
>  	/* USBMODE should be configured step by step */
>  	hw_write(ci, OP_USBMODE, USBMODE_CM, USBMODE_CM_IDLE);
>  	hw_write(ci, OP_USBMODE, USBMODE_CM, mode);
> @@ -412,6 +420,9 @@ static int ci_get_platdata(struct device *dev,
>  		}
>  	}
>  
> +	if (of_usb_get_maximum_speed(dev->of_node) == USB_SPEED_FULL)
> +		platdata->flags |= CI_HDRC_FORCE_FULLSPEED;
> +
>  	return 0;
>  }
>  
> diff --git a/include/linux/usb/chipidea.h b/include/linux/usb/chipidea.h
> index 708bd11..bbe779f 100644
> --- a/include/linux/usb/chipidea.h
> +++ b/include/linux/usb/chipidea.h
> @@ -25,6 +25,7 @@ struct ci_hdrc_platform_data {
>  	 */
>  #define CI_HDRC_DUAL_ROLE_NOT_OTG	BIT(4)
>  #define CI_HDRC_IMX28_WRITE_FIX		BIT(5)
> +#define CI_HDRC_FORCE_FULLSPEED		BIT(6)
>  	enum usb_dr_mode	dr_mode;
>  #define CI_HDRC_CONTROLLER_RESET_EVENT		0
>  #define CI_HDRC_CONTROLLER_STOPPED_EVENT	1
> -- 
> 1.8.5.3
> 
> 
Tested and applied it, thanks.

-- 

Best Regards,
Peter Chen

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




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux