u-boot/drivers/usb/host/ohci-generic.c
Tom Rini d678a59d2d Revert "Merge patch series "arm: dts: am62-beagleplay: Fix Beagleplay Ethernet""
When bringing in the series 'arm: dts: am62-beagleplay: Fix Beagleplay
Ethernet"' I failed to notice that b4 noticed it was based on next and
so took that as the base commit and merged that part of next to master.

This reverts commit c8ffd1356d, reversing
changes made to 2ee6f3a5f7.

Reported-by: Jonas Karlman <jonas@kwiboo.se>
Signed-off-by: Tom Rini <trini@konsulko.com>
2024-05-19 08:16:36 -06:00

116 lines
2.3 KiB
C

// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2015 Alexey Brodkin <abrodkin@synopsys.com>
*/
#include <common.h>
#include <clk.h>
#include <dm.h>
#include <log.h>
#include <dm/device_compat.h>
#include <dm/devres.h>
#include <dm/ofnode.h>
#include <generic-phy.h>
#include <reset.h>
#include "ohci.h"
struct generic_ohci {
ohci_t ohci;
struct clk_bulk clocks; /* clock list */
struct reset_ctl_bulk resets; /* reset list */
struct phy phy;
};
static int ohci_usb_probe(struct udevice *dev)
{
struct ohci_regs *regs = dev_read_addr_ptr(dev);
struct generic_ohci *priv = dev_get_priv(dev);
int err, ret;
ret = clk_get_bulk(dev, &priv->clocks);
if (ret && ret != -ENOENT) {
dev_err(dev, "Failed to get clocks (ret=%d)\n", ret);
return ret;
}
err = clk_enable_bulk(&priv->clocks);
if (err) {
dev_err(dev, "Failed to enable clocks (err=%d)\n", err);
goto clk_err;
}
err = reset_get_bulk(dev, &priv->resets);
if (err && err != -ENOENT) {
dev_err(dev, "failed to get resets (err=%d)\n", err);
goto clk_err;
}
err = reset_deassert_bulk(&priv->resets);
if (err) {
dev_err(dev, "failed to deassert resets (err=%d)\n", err);
goto reset_err;
}
err = generic_setup_phy(dev, &priv->phy, 0);
if (err)
goto reset_err;
err = ohci_register(dev, regs);
if (err)
goto phy_err;
return 0;
phy_err:
ret = generic_shutdown_phy(&priv->phy);
if (ret)
dev_err(dev, "failed to shutdown usb phy\n");
reset_err:
ret = reset_release_bulk(&priv->resets);
if (ret)
dev_err(dev, "failed to release resets (ret=%d)\n", ret);
clk_err:
ret = clk_release_bulk(&priv->clocks);
if (ret)
dev_err(dev, "failed to release clocks (ret=%d)\n", ret);
return err;
}
static int ohci_usb_remove(struct udevice *dev)
{
struct generic_ohci *priv = dev_get_priv(dev);
int ret;
ret = ohci_deregister(dev);
if (ret)
return ret;
ret = generic_shutdown_phy(&priv->phy);
if (ret)
return ret;
ret = reset_release_bulk(&priv->resets);
if (ret)
return ret;
return clk_release_bulk(&priv->clocks);
}
static const struct udevice_id ohci_usb_ids[] = {
{ .compatible = "generic-ohci" },
{ }
};
U_BOOT_DRIVER(ohci_generic) = {
.name = "ohci_generic",
.id = UCLASS_USB,
.of_match = ohci_usb_ids,
.probe = ohci_usb_probe,
.remove = ohci_usb_remove,
.ops = &ohci_usb_ops,
.priv_auto = sizeof(struct generic_ohci),
.flags = DM_FLAG_ALLOC_PRIV_DMA,
};