mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2025-09-19 21:01:51 +02:00
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 c8ffd1356d42223cbb8c86280a083cc3c93e6426, reversing changes made to 2ee6f3a5f7550de3599faef9704e166e5dcace35. Reported-by: Jonas Karlman <jonas@kwiboo.se> Signed-off-by: Tom Rini <trini@konsulko.com>
116 lines
2.3 KiB
C
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,
|
|
};
|