summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/arm/ti
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2018-08-21 13:47:02 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-09-21 10:29:41 +0200
commitbcdce02d9bc8150e1d191ed5ca9da45b7604964a (patch)
tree3b2faf509db7672ee1fc98857736470be97e7ed8 /freebsd/sys/arm/ti
parentUpdate to FreeBSD head 2018-04-01 (diff)
downloadrtems-libbsd-bcdce02d9bc8150e1d191ed5ca9da45b7604964a.tar.bz2
Update to FreeBSD head 2018-06-01
Git mirror commit fb63610a69b0eb7f69a201ba05c4c1a7a2739cf9. Update #3472.
Diffstat (limited to 'freebsd/sys/arm/ti')
-rw-r--r--freebsd/sys/arm/ti/am335x/am335x_prcm.c35
-rw-r--r--freebsd/sys/arm/ti/ti_hwmods.c6
2 files changed, 34 insertions, 7 deletions
diff --git a/freebsd/sys/arm/ti/am335x/am335x_prcm.c b/freebsd/sys/arm/ti/am335x/am335x_prcm.c
index 83faafbd..eb27555e 100644
--- a/freebsd/sys/arm/ti/am335x/am335x_prcm.c
+++ b/freebsd/sys/arm/ti/am335x/am335x_prcm.c
@@ -138,6 +138,7 @@ struct am335x_prcm_softc {
struct resource * res[2];
bus_space_tag_t bst;
bus_space_handle_t bsh;
+ int attach_done;
};
static struct resource_spec am335x_prcm_spec[] = {
@@ -426,7 +427,6 @@ static int
am335x_prcm_attach(device_t dev)
{
struct am335x_prcm_softc *sc = device_get_softc(dev);
- unsigned int sysclk, fclk;
if (am335x_prcm_sc)
return (ENXIO);
@@ -444,6 +444,24 @@ am335x_prcm_attach(device_t dev)
ti_cpu_reset = am335x_prcm_reset;
#endif /* __rtems__ */
+ return (0);
+}
+
+static void
+am335x_prcm_new_pass(device_t dev)
+{
+ struct am335x_prcm_softc *sc = device_get_softc(dev);
+ unsigned int sysclk, fclk;
+
+ sc = device_get_softc(dev);
+ if (sc->attach_done ||
+ bus_current_pass < (BUS_PASS_TIMER + BUS_PASS_ORDER_EARLY)) {
+ bus_generic_new_pass(dev);
+ return;
+ }
+
+ sc->attach_done = 1;
+
if (am335x_clk_get_sysclk_freq(NULL, &sysclk) != 0)
sysclk = 0;
if (am335x_clk_get_arm_fclk_freq(NULL, &fclk) != 0)
@@ -451,15 +469,24 @@ am335x_prcm_attach(device_t dev)
if (sysclk && fclk)
device_printf(dev, "Clocks: System %u.%01u MHz, CPU %u MHz\n",
sysclk/1000000, (sysclk % 1000000)/100000, fclk/1000000);
- else
+ else {
device_printf(dev, "can't read frequencies yet (SCM device not ready?)\n");
+ goto fail;
+ }
- return (0);
+ return;
+
+fail:
+ device_detach(dev);
+ return;
}
static device_method_t am335x_prcm_methods[] = {
DEVMETHOD(device_probe, am335x_prcm_probe),
DEVMETHOD(device_attach, am335x_prcm_attach),
+
+ /* Bus interface */
+ DEVMETHOD(bus_new_pass, am335x_prcm_new_pass),
{ 0, 0 }
};
@@ -472,7 +499,7 @@ static driver_t am335x_prcm_driver = {
static devclass_t am335x_prcm_devclass;
EARLY_DRIVER_MODULE(am335x_prcm, simplebus, am335x_prcm_driver,
- am335x_prcm_devclass, 0, 0, BUS_PASS_TIMER + BUS_PASS_ORDER_EARLY);
+ am335x_prcm_devclass, 0, 0, BUS_PASS_BUS + BUS_PASS_ORDER_MIDDLE);
MODULE_VERSION(am335x_prcm, 1);
MODULE_DEPEND(am335x_prcm, ti_scm, 1, 1, 1);
diff --git a/freebsd/sys/arm/ti/ti_hwmods.c b/freebsd/sys/arm/ti/ti_hwmods.c
index 0e703472..450679a7 100644
--- a/freebsd/sys/arm/ti/ti_hwmods.c
+++ b/freebsd/sys/arm/ti/ti_hwmods.c
@@ -112,7 +112,7 @@ ti_hwmods_get_clock(device_t dev)
if ((node = ofw_bus_get_node(dev)) == 0)
return (INVALID_CLK_IDENT);
- if ((len = OF_getprop_alloc(node, "ti,hwmods", 1, (void**)&name)) <= 0)
+ if ((len = OF_getprop_alloc(node, "ti,hwmods", (void**)&name)) <= 0)
return (INVALID_CLK_IDENT);
buf = name;
@@ -150,7 +150,7 @@ int ti_hwmods_contains(device_t dev, const char *hwmod)
if ((node = ofw_bus_get_node(dev)) == 0)
return (0);
- if ((len = OF_getprop_alloc(node, "ti,hwmods", 1, (void**)&name)) <= 0)
+ if ((len = OF_getprop_alloc(node, "ti,hwmods", (void**)&name)) <= 0)
return (0);
buf = name;
@@ -184,7 +184,7 @@ ti_hwmods_get_unit(device_t dev, const char *hwmod)
if ((node = ofw_bus_get_node(dev)) == 0)
return (0);
- if ((len = OF_getprop_alloc(node, "ti,hwmods", 1, (void**)&name)) <= 0)
+ if ((len = OF_getprop_alloc(node, "ti,hwmods", (void**)&name)) <= 0)
return (0);
buf = name;