[U-Boot] [PATCH v2 11/14] musb: sunxi: switch to the device model

Łukasz Majewski lukma at denx.de
Wed Sep 13 10:46:14 UTC 2017


On 09/12/2017 09:01 PM, Maxime Ripard wrote:
> The device model was implemented so far using a hook that needed to be
> called from the board support, without DT support and only for the host.
> 
> Switch to probing both in peripheral and host mode through the DT.
> 
> Reviewed-by: Simon Glass <sjg at chromium.org>
> Signed-off-by: Maxime Ripard <maxime.ripard at free-electrons.com>
> ---
>   arch/arm/include/asm/arch-sunxi/usb_phy.h |  7 +---
>   board/sunxi/board.c                       |  1 +-
>   drivers/usb/musb-new/sunxi.c              | 56 +++++++++++-------------
>   3 files changed, 27 insertions(+), 37 deletions(-)
> 
> diff --git a/arch/arm/include/asm/arch-sunxi/usb_phy.h b/arch/arm/include/asm/arch-sunxi/usb_phy.h
> index cef6c985bc8d..5a9cacb6f4a3 100644
> --- a/arch/arm/include/asm/arch-sunxi/usb_phy.h
> +++ b/arch/arm/include/asm/arch-sunxi/usb_phy.h
> @@ -19,10 +19,3 @@ void sunxi_usb_phy_power_off(int index);
>   int sunxi_usb_phy_vbus_detect(int index);
>   int sunxi_usb_phy_id_detect(int index);
>   void sunxi_usb_phy_enable_squelch_detect(int index, int enable);
> -
> -/* Not really phy related, but we have to declare this somewhere ... */
> -#if defined(CONFIG_USB_MUSB_HOST) || defined(CONFIG_USB_MUSB_GADGET)
> -void sunxi_musb_board_init(void);
> -#else
> -#define sunxi_musb_board_init()
> -#endif
> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
> index 70e01437c4f4..f9224360d758 100644
> --- a/board/sunxi/board.c
> +++ b/board/sunxi/board.c
> @@ -736,7 +736,6 @@ int misc_init_r(void)
>   	if (ret)
>   		return ret;
>   #endif
> -	sunxi_musb_board_init();
>   
>   	return 0;
>   }
> diff --git a/drivers/usb/musb-new/sunxi.c b/drivers/usb/musb-new/sunxi.c
> index 5c1a902e42dc..7ee44ea91900 100644
> --- a/drivers/usb/musb-new/sunxi.c
> +++ b/drivers/usb/musb-new/sunxi.c
> @@ -308,9 +308,6 @@ static struct musb_hdrc_platform_data musb_plat = {
>   	.platform_ops	= &sunxi_musb_ops,
>   };
>   
> -#ifdef CONFIG_USB_MUSB_HOST
> -static int musb_usb_remove(struct udevice *dev);
> -
>   static int musb_usb_probe(struct udevice *dev)
>   {
>   	struct musb_host_data *host = dev_get_priv(dev);
> @@ -319,16 +316,20 @@ static int musb_usb_probe(struct udevice *dev)
>   
>   	priv->desc_before_addr = true;
>   
> +#ifdef CONFIG_USB_MUSB_HOST
>   	host->host = musb_init_controller(&musb_plat, NULL,
>   					  (void *)SUNXI_USB0_BASE);
>   	if (!host->host)
>   		return -EIO;
>   
>   	ret = musb_lowlevel_init(host);
> -	if (ret == 0)
> -		printf("MUSB OTG\n");
> -	else
> -		musb_usb_remove(dev);
> +	if (!ret)
> +		printf("Allwinner mUSB OTG (Host)\n");
> +#else
> +	ret = musb_register(&musb_plat, NULL, (void *)SUNXI_USB0_BASE);
> +	if (!ret)
> +		printf("Allwinner mUSB OTG (Peripheral)\n");
> +#endif
>   
>   	return ret;
>   }
> @@ -352,30 +353,27 @@ static int musb_usb_remove(struct udevice *dev)
>   	return 0;
>   }
>   
> -U_BOOT_DRIVER(usb_musb) = {
> -	.name	= "sunxi-musb",
> -	.id	= UCLASS_USB,
> -	.probe = musb_usb_probe,
> -	.remove = musb_usb_remove,
> -	.ops	= &musb_usb_ops,
> -	.platdata_auto_alloc_size = sizeof(struct usb_platdata),
> -	.priv_auto_alloc_size = sizeof(struct musb_host_data),
> +static const struct udevice_id sunxi_musb_ids[] = {
> +	{ .compatible = "allwinner,sun4i-a10-musb" },
> +	{ .compatible = "allwinner,sun6i-a31-musb" },
> +	{ .compatible = "allwinner,sun8i-a33-musb" },
> +	{ .compatible = "allwinner,sun8i-h3-musb" },
> +	{ }
>   };
> -#endif
>   
> -void sunxi_musb_board_init(void)
> -{
> +U_BOOT_DRIVER(usb_musb) = {
> +	.name		= "sunxi-musb",
>   #ifdef CONFIG_USB_MUSB_HOST
> -	struct udevice *dev;
> -
> -	/*
> -	 * Bind the driver directly for now as musb linux kernel support is
> -	 * still pending upstream so our dts files do not have the necessary
> -	 * nodes yet. TODO: Remove this as soon as the dts nodes are in place
> -	 * and bind by compatible instead.
> -	 */
> -	device_bind_driver(dm_root(), "sunxi-musb", "sunxi-musb", &dev);
> +	.id		= UCLASS_USB,
>   #else
> -	musb_register(&musb_plat, NULL, (void *)SUNXI_USB0_BASE);
> +	.id		= UCLASS_USB_DEV_GENERIC,
>   #endif
> -}
> +	.of_match	= sunxi_musb_ids,
> +	.probe		= musb_usb_probe,
> +	.remove		= musb_usb_remove,
> +#ifdef CONFIG_USB_MUSB_HOST
> +	.ops		= &musb_usb_ops,
> +#endif
> +	.platdata_auto_alloc_size = sizeof(struct usb_platdata),
> +	.priv_auto_alloc_size = sizeof(struct musb_host_data),
> +};
> 

Reviewed-by: Łukasz 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-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de


More information about the U-Boot mailing list