[U-Boot] [PATCH 13/16] usb: dwc2: add support for STM32MP1

Lukasz Majewski lukma at denx.de
Mon Apr 8 21:56:06 UTC 2019


On Fri, 29 Mar 2019 15:42:21 +0100
Patrick Delaunay <patrick.delaunay at st.com> wrote:

> Add compatible "st,stm32mp1-hsotg" and associated driver data to
> manage the usb33d-supply and the ST specific register for VBus
> sensing.
> 
> Signed-off-by: Patrick Delaunay <patrick.delaunay at st.com>
> # Conflicts:
> #	drivers/usb/gadget/dwc2_udc_otg.c
> 
> ---
> 
>  doc/device-tree-bindings/usb/dwc2.txt  |  2 ++
>  drivers/usb/gadget/dwc2_udc_otg.c      | 45
> ++++++++++++++++++++++++++++++++++
> drivers/usb/gadget/dwc2_udc_otg_regs.h | 10 ++++++--
> include/usb/dwc2_udc.h                 |  1 + 4 files changed, 56
> insertions(+), 2 deletions(-)
> 
> diff --git a/doc/device-tree-bindings/usb/dwc2.txt
> b/doc/device-tree-bindings/usb/dwc2.txt index 6dc3c4a..eb60ffa 100644
> --- a/doc/device-tree-bindings/usb/dwc2.txt
> +++ b/doc/device-tree-bindings/usb/dwc2.txt
> @@ -37,6 +37,8 @@ Refer to phy/phy-bindings.txt for generic phy
> consumer properties
>  - g-rx-fifo-size: size of rx fifo size in gadget mode.
>  - g-np-tx-fifo-size: size of non-periodic tx fifo size in gadget
> mode.
>  - g-tx-fifo-size: size of periodic tx fifo per endpoint (except ep0)
> in gadget mode. +- usb33d-supply: external VBUS and ID sensing
> comparators supply, in order to
> +  perform OTG operation, used on STM32MP1 SoCs.
>  
>  Deprecated properties:
>  - g-use-dma: gadget DMA mode is automatically detected
> diff --git a/drivers/usb/gadget/dwc2_udc_otg.c
> b/drivers/usb/gadget/dwc2_udc_otg.c index 106dec5..3fdaa10 100644
> --- a/drivers/usb/gadget/dwc2_udc_otg.c
> +++ b/drivers/usb/gadget/dwc2_udc_otg.c
> @@ -942,6 +942,7 @@ struct dwc2_priv_data {
>  	struct reset_ctl_bulk	resets;
>  	struct phy *phys;
>  	int num_phys;
> +	struct udevice *usb33d_supply;
>  };
>  
>  int dm_usb_gadget_handle_interrupts(struct udevice *dev)
> @@ -1036,6 +1037,8 @@ static int
> dwc2_udc_otg_ofdata_to_platdata(struct udevice *dev) {
>  	struct dwc2_plat_otg_data *platdata = dev_get_platdata(dev);
>  	int node = dev_of_offset(dev);
> +	ulong drvdata;
> +	void (*set_params)(struct dwc2_plat_otg_data *data);
>  
>  	if (usb_get_dr_mode(node) != USB_DR_MODE_PERIPHERAL) {
>  		dev_dbg(dev, "Invalid mode\n");
> @@ -1052,9 +1055,28 @@ static int
> dwc2_udc_otg_ofdata_to_platdata(struct udevice *dev)
> platdata->force_b_session_valid = dev_read_bool(dev,
> "force-b-session-valid"); 
> +	/* force platdata according compatible */
> +	drvdata = dev_get_driver_data(dev);
> +	if (drvdata) {
> +		set_params = (void *)drvdata;
> +		set_params(platdata);
> +	}
> +
>  	return 0;
>  }
>  
> +static void dwc2_set_stm32mp1_hsotg_params(struct dwc2_plat_otg_data
> *p) +{
> +	p->activate_stm_id_vb_detection = true;
> +	p->usb_gusbcfg =
> +		0 << 15		/* PHY Low Power Clock sel*/
> +		| 0x9 << 10	/* USB Turnaround time (0x9 for
> HS phy) */
> +		| 0 << 9	/* [0:HNP disable,1:HNP enable]*/
> +		| 0 << 8	/* [0:SRP disable 1:SRP enable]*/
> +		| 0 << 6	/* 0: high speed utmi+, 1: full
> speed serial*/
> +		| 0x7 << 0;	/* FS timeout calibration**/
> +}
> +
>  static int dwc2_udc_otg_reset_init(struct udevice *dev,
>  				   struct reset_ctl_bulk *resets)
>  {
> @@ -1122,6 +1144,26 @@ static int dwc2_udc_otg_probe(struct udevice
> *dev) if (ret)
>  		return ret;
>  
> +	if (CONFIG_IS_ENABLED(DM_REGULATOR) &&
> +	    platdata->activate_stm_id_vb_detection &&
> +	    !platdata->force_b_session_valid) {
> +		ret = device_get_supply_regulator(dev,
> "usb33d-supply",
> +
> &priv->usb33d_supply);
> +		if (ret) {
> +			dev_err(dev, "can't get voltage level
> detector supply\n");
> +			return ret;
> +		}
> +		ret = regulator_set_enable(priv->usb33d_supply,
> true);
> +		if (ret) {
> +			dev_err(dev, "can't enable voltage level
> detector supply\n");
> +			return ret;
> +		}
> +		/* Enable vbus sensing */
> +		setbits_le32(&usbotg_reg->ggpio,
> +			     GGPIO_STM32_OTG_GCCFG_VBDEN |
> +			     GGPIO_STM32_OTG_GCCFG_IDEN);
> +	}
> +
>  	if (platdata->force_b_session_valid)
>  		/* Override B session bits : value and enable */
>  		setbits_le32(&usbotg_reg->gotgctl,  B_VALOEN |
> B_VALOVAL); @@ -1154,6 +1196,9 @@ static int
> dwc2_udc_otg_remove(struct udevice *dev) 
>  static const struct udevice_id dwc2_udc_otg_ids[] = {
>  	{ .compatible = "snps,dwc2" },
> +	{ .compatible = "st,stm32mp1-hsotg",
> +	  .data = (ulong)dwc2_set_stm32mp1_hsotg_params },
> +	{},
>  };
>  
>  U_BOOT_DRIVER(dwc2_udc_otg) = {
> diff --git a/drivers/usb/gadget/dwc2_udc_otg_regs.h
> b/drivers/usb/gadget/dwc2_udc_otg_regs.h index a389923..b2a28d7 100644
> --- a/drivers/usb/gadget/dwc2_udc_otg_regs.h
> +++ b/drivers/usb/gadget/dwc2_udc_otg_regs.h
> @@ -60,8 +60,9 @@ struct dwc2_usbotg_reg {
>  	u32 grxstsp; /* Receive Status Debug Pop/Status Pop */
>  	u32 grxfsiz; /* Receive FIFO Size */
>  	u32 gnptxfsiz; /* Non-Periodic Transmit FIFO Size */
> -
> -	u8  res1[36];
> +	u8  res0[12];
> +	u32 ggpio;     /* 0x038 */
> +	u8  res1[20];
>  	u32 ghwcfg4; /* User HW Config4 */
>  	u8  res2[176];
>  	u32 dieptxf[15]; /* Device Periodic Transmit FIFO size
> register */ @@ -280,4 +281,9 @@ struct dwc2_usbotg_reg {
>  /* User HW Config4 */
>  #define GHWCFG4_NUM_IN_EPS_MASK		(0xf << 26)
>  #define GHWCFG4_NUM_IN_EPS_SHIFT	26
> +
> +/* OTG general core configuration register (OTG_GCCFG:0x38) for
> STM32MP1 */ +#define GGPIO_STM32_OTG_GCCFG_VBDEN               BIT(21)
> +#define GGPIO_STM32_OTG_GCCFG_IDEN                BIT(22)
> +
>  #endif
> diff --git a/include/usb/dwc2_udc.h b/include/usb/dwc2_udc.h
> index 369f6fb..a6c1221 100644
> --- a/include/usb/dwc2_udc.h
> +++ b/include/usb/dwc2_udc.h
> @@ -26,6 +26,7 @@ struct dwc2_plat_otg_data {
>  	unsigned int	tx_fifo_sz_array[DWC2_MAX_HW_ENDPOINTS];
>  	unsigned char   tx_fifo_sz_nb;
>  	bool		force_b_session_valid;
> +	bool		activate_stm_id_vb_detection;
>  };
>  
>  int dwc2_udc_probe(struct dwc2_plat_otg_data *pdata);

Reviewed-by: Lukasz Majewski <lukma at denx.de>


Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma at denx.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20190408/bb806eaf/attachment.sig>


More information about the U-Boot mailing list