mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-10-04 18:40:42 +09:00
41575d8e4c
This construct is quite long-winded. In earlier days it made some sense since auto-allocation was a strange concept. But with driver model now used pretty universally, we can shorten this to 'auto'. This reduces verbosity and makes it easier to read. Coincidentally it also ensures that every declaration is on one line, thus making dtoc's job easier. Signed-off-by: Simon Glass <sjg@chromium.org>
108 lines
2.1 KiB
C
108 lines
2.1 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* dwc3-of-simple.c - OF glue layer for simple integrations
|
|
*
|
|
* Copyright (c) 2015 Texas Instruments Incorporated - http://www.ti.com
|
|
*
|
|
* Author: Felipe Balbi <balbi@ti.com>
|
|
*
|
|
* Copyright (C) 2018 BayLibre, SAS
|
|
* Author: Neil Armstrong <narmstron@baylibre.com>
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <dm.h>
|
|
#include <reset.h>
|
|
#include <clk.h>
|
|
|
|
struct dwc3_of_simple {
|
|
struct clk_bulk clks;
|
|
struct reset_ctl_bulk resets;
|
|
};
|
|
|
|
static int dwc3_of_simple_reset_init(struct udevice *dev,
|
|
struct dwc3_of_simple *simple)
|
|
{
|
|
int ret;
|
|
|
|
ret = reset_get_bulk(dev, &simple->resets);
|
|
if (ret == -ENOTSUPP)
|
|
return 0;
|
|
else if (ret)
|
|
return ret;
|
|
|
|
ret = reset_deassert_bulk(&simple->resets);
|
|
if (ret) {
|
|
reset_release_bulk(&simple->resets);
|
|
return ret;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int dwc3_of_simple_clk_init(struct udevice *dev,
|
|
struct dwc3_of_simple *simple)
|
|
{
|
|
int ret;
|
|
|
|
ret = clk_get_bulk(dev, &simple->clks);
|
|
if (ret == -ENOSYS)
|
|
return 0;
|
|
if (ret)
|
|
return ret;
|
|
|
|
#if CONFIG_IS_ENABLED(CLK)
|
|
ret = clk_enable_bulk(&simple->clks);
|
|
if (ret) {
|
|
clk_release_bulk(&simple->clks);
|
|
return ret;
|
|
}
|
|
#endif
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int dwc3_of_simple_probe(struct udevice *dev)
|
|
{
|
|
struct dwc3_of_simple *simple = dev_get_platdata(dev);
|
|
int ret;
|
|
|
|
ret = dwc3_of_simple_clk_init(dev, simple);
|
|
if (ret)
|
|
return ret;
|
|
|
|
ret = dwc3_of_simple_reset_init(dev, simple);
|
|
if (ret)
|
|
return ret;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int dwc3_of_simple_remove(struct udevice *dev)
|
|
{
|
|
struct dwc3_of_simple *simple = dev_get_platdata(dev);
|
|
|
|
reset_release_bulk(&simple->resets);
|
|
|
|
clk_release_bulk(&simple->clks);
|
|
|
|
return dm_scan_fdt_dev(dev);
|
|
}
|
|
|
|
static const struct udevice_id dwc3_of_simple_ids[] = {
|
|
{ .compatible = "amlogic,meson-gxl-dwc3" },
|
|
{ .compatible = "rockchip,rk3399-dwc3" },
|
|
{ .compatible = "ti,dwc3" },
|
|
{ }
|
|
};
|
|
|
|
U_BOOT_DRIVER(dwc3_of_simple) = {
|
|
.name = "dwc3-of-simple",
|
|
.id = UCLASS_SIMPLE_BUS,
|
|
.of_match = dwc3_of_simple_ids,
|
|
.probe = dwc3_of_simple_probe,
|
|
.remove = dwc3_of_simple_remove,
|
|
.platdata_auto = sizeof(struct dwc3_of_simple),
|
|
.flags = DM_FLAG_ALLOC_PRIV_DMA,
|
|
};
|