Skip to content
Snippets Groups Projects
Commit 3a61b080 authored by Maxime Ripard's avatar Maxime Ripard
Browse files

musb: sunxi: switch to the device model


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: default avatarŁukasz Majewski <lukma@denx.de>
Reviewed-by: default avatarSimon Glass <sjg@chromium.org>
Signed-off-by: default avatarMaxime Ripard <maxime.ripard@free-electrons.com>
parent cfa34996
No related branches found
No related tags found
No related merge requests found
......@@ -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
......@@ -736,7 +736,6 @@ int misc_init_r(void)
if (ret)
return ret;
#endif
sunxi_musb_board_init();
return 0;
}
......
......@@ -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),
};
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment