diff options
| author | Tom Rini <trini@konsulko.com> | 2022-09-26 08:29:42 -0400 | 
|---|---|---|
| committer | Tom Rini <trini@konsulko.com> | 2022-09-26 08:29:42 -0400 | 
| commit | d9993452cbf7e2111377f79dc523bde5a69e0739 (patch) | |
| tree | 0049fa5ea0ac297a99765643d2a40d3128874af8 /drivers/usb/host/ohci-npcm.c | |
| parent | 435596d57f8beedf36b5dc858fe7ba9d6c03334b (diff) | |
| parent | 206af3dec00071ec96c0fdec6c8dda3a039c07cf (diff) | |
Merge https://gitlab.denx.de/u-boot/custodians/u-boot-usb
- DWC2 gadget EP fix, nuvoton NPCM7xx ehci/ohci driver
Diffstat (limited to 'drivers/usb/host/ohci-npcm.c')
| -rw-r--r-- | drivers/usb/host/ohci-npcm.c | 108 | 
1 files changed, 108 insertions, 0 deletions
| diff --git a/drivers/usb/host/ohci-npcm.c b/drivers/usb/host/ohci-npcm.c new file mode 100644 index 00000000000..9e1d5298809 --- /dev/null +++ b/drivers/usb/host/ohci-npcm.c @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (c) 2021 Nuvoton Technology Corp. + */ + +#include <common.h> +#include <dm.h> +#include <generic-phy.h> +#include <reset.h> +#include <asm/io.h> +#include <dm/device_compat.h> +#include <linux/delay.h> +#include "ohci.h" + +struct npcm_ohci_priv { +	ohci_t ohci; +	struct phy phy; +}; + +static int npcm_ohci_setup_phy(struct udevice *dev, struct phy *phy) +{ +	int ret; + +	if (!phy) +		return 0; + +	ret = generic_phy_get_by_index(dev, 0, phy); +	if (ret) { +		if (ret != -ENOENT) { +			dev_err(dev, "failed to get usb phy\n"); +			return ret; +		} +	} else { +		ret = generic_phy_init(phy); +		if (ret) { +			dev_err(dev, "failed to init usb phy\n"); +			return ret; +		} +	} + +	return 0; +} + +static int npcm_ohci_init(struct udevice *dev) +{ +	struct npcm_ohci_priv *priv = dev_get_priv(dev); +	struct reset_ctl reset; +	int ret; + +	ret = reset_get_by_index(dev, 0, &reset); +	if (ret && ret != -ENOENT && ret != -ENOTSUPP) { +		dev_err(dev, "failed to get reset\n"); +		return ret; +	} + +	/* reset controller */ +	if (reset_valid(&reset)) +		reset_assert(&reset); + +	/* setup phy */ +	ret = npcm_ohci_setup_phy(dev, &priv->phy); +	if (ret) +		return ret; + +	/* release controller from reset */ +	if (reset_valid(&reset)) +		reset_deassert(&reset); + +	return 0; +} + +static int npcm_ohci_probe(struct udevice *dev) +{ +	struct ohci_regs *regs = dev_read_addr_ptr(dev); +	int ret; + +	ret = npcm_ohci_init(dev); +	if (ret) +		return ret; + +	return ohci_register(dev, regs); +} + +static int npcm_ohci_remove(struct udevice *dev) +{ +	struct npcm_ohci_priv *priv = dev_get_priv(dev); + +	generic_phy_exit(&priv->phy); + +	return ohci_deregister(dev); +} + +static const struct udevice_id npcm_ohci_ids[] = { +	{ .compatible = "nuvoton,npcm845-ohci" }, +	{ .compatible = "nuvoton,npcm750-ohci" }, +	{ } +}; + +U_BOOT_DRIVER(ohci_npcm) = { +	.name	= "ohci_npcm", +	.id	= UCLASS_USB, +	.of_match = npcm_ohci_ids, +	.probe = npcm_ohci_probe, +	.remove = npcm_ohci_remove, +	.ops	= &ohci_usb_ops, +	.priv_auto = sizeof(struct npcm_ohci_priv), +	.flags	= DM_FLAG_ALLOC_PRIV_DMA, +}; | 
