Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F153659669
D27889.id81607.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
71 KB
Referenced Files
None
Subscribers
None
D27889.id81607.diff
View Options
diff --git a/sys/arm/ti/clk/clock_common.h b/sys/arm/ti/clk/clock_common.h
--- a/sys/arm/ti/clk/clock_common.h
+++ b/sys/arm/ti/clk/clock_common.h
@@ -30,14 +30,20 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-struct clock_cell_info {
- cell_t *clock_cells;
- uint8_t *clock_cells_ncells;
- uint32_t num_clock_cells;
- uint8_t num_real_clocks;
+struct parent_lookup_table {
+ const char *node_name;
+ int parent_cnt;
+ const char **parent_names;
};
-void read_clock_cells(device_t dev, struct clock_cell_info *clk);
-int find_parent_clock_names(device_t dev, struct clock_cell_info *clk, struct clknode_init_def *def);
-void create_clkdef(device_t dev, struct clock_cell_info *clk, struct clknode_init_def *def);
-void free_clkdef(struct clknode_init_def *def);
+/* From rk3399_cru.c & rk_cru.c */
+#define PLIST(x) static const char *x[]
+
+#define LINK(_name) \
+{ \
+ .clkdef.id = 0, \
+ .clkdef.name = _name, \
+ .clkdef.parent_names = NULL, \
+ .clkdef.parent_cnt = 0, \
+ .clkdef.flags = CLK_NODE_STATIC_STRINGS, \
+}
diff --git a/sys/arm/ti/clk/clock_common.c b/sys/arm/ti/clk/clock_common.c
--- a/sys/arm/ti/clk/clock_common.c
+++ b/sys/arm/ti/clk/clock_common.c
@@ -1,152 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
- *
- * Copyright (c) 2020 Oskar Holmlund <oskar.holmlund@ohdata.se>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/conf.h>
-#include <sys/bus.h>
-#include <sys/kernel.h>
-#include <sys/module.h>
-#include <sys/systm.h>
-#include <sys/libkern.h>
-#include <sys/types.h>
-#include <sys/malloc.h>
-
-#include <machine/bus.h>
-#include <dev/fdt/simplebus.h>
-
-#include <dev/extres/clk/clk_mux.h>
-#include <dev/ofw/ofw_bus.h>
-#include <dev/ofw/ofw_bus_subr.h>
-
-#include "clock_common.h"
-
-#if 0
-#define DPRINTF(dev, msg...) device_printf(dev, msg)
-#else
-#define DPRINTF(dev, msg...)
-#endif
-
-void
-read_clock_cells(device_t dev, struct clock_cell_info *clk) {
- ssize_t numbytes_clocks;
- phandle_t node, parent, *cells;
- int index, ncells, rv;
-
- node = ofw_bus_get_node(dev);
-
- /* Get names of parent clocks */
- numbytes_clocks = OF_getproplen(node, "clocks");
- clk->num_clock_cells = numbytes_clocks / sizeof(cell_t);
-
- /* Allocate space and get clock cells content */
- /* clock_cells / clock_cells_ncells will be freed in
- * find_parent_clock_names()
- */
- clk->clock_cells = malloc(numbytes_clocks, M_DEVBUF, M_WAITOK|M_ZERO);
- clk->clock_cells_ncells = malloc(clk->num_clock_cells*sizeof(uint8_t),
- M_DEVBUF, M_WAITOK|M_ZERO);
- OF_getencprop(node, "clocks", clk->clock_cells, numbytes_clocks);
-
- /* Count number of clocks */
- clk->num_real_clocks = 0;
- for (index = 0; index < clk->num_clock_cells; index++) {
- rv = ofw_bus_parse_xref_list_alloc(node, "clocks", "#clock-cells",
- clk->num_real_clocks, &parent, &ncells, &cells);
- if (rv != 0)
- continue;
-
- if (cells != NULL)
- OF_prop_free(cells);
-
- clk->clock_cells_ncells[index] = ncells;
- index += ncells;
- clk->num_real_clocks++;
- }
-}
-
-int
-find_parent_clock_names(device_t dev, struct clock_cell_info *clk, struct clknode_init_def *def) {
- int index, clock_index, err;
- bool found_all = true;
- clk_t parent;
-
- /* Figure out names */
- for (index = 0, clock_index = 0; index < clk->num_clock_cells; index++) {
- /* Get name of parent clock */
- err = clk_get_by_ofw_index(dev, 0, clock_index, &parent);
- if (err != 0) {
- clock_index++;
- found_all = false;
- DPRINTF(dev, "Failed to find clock_cells[%d]=0x%x\n",
- index, clk->clock_cells[index]);
-
- index += clk->clock_cells_ncells[index];
- continue;
- }
-
- def->parent_names[clock_index] = clk_get_name(parent);
- clk_release(parent);
-
- DPRINTF(dev, "Found parent clock[%d/%d]: %s\n",
- clock_index, clk->num_real_clocks,
- def->parent_names[clock_index]);
-
- clock_index++;
- index += clk->clock_cells_ncells[index];
- }
-
- if (!found_all) {
- return 1;
- }
-
- free(clk->clock_cells, M_DEVBUF);
- free(clk->clock_cells_ncells, M_DEVBUF);
- return 0;
-}
-
-void
-create_clkdef(device_t dev, struct clock_cell_info *clk, struct clknode_init_def *def) {
- def->id = 1;
-
- clk_parse_ofw_clk_name(dev, ofw_bus_get_node(dev), &def->name);
-
- DPRINTF(dev, "node name: %s\n", def->name);
-
- def->parent_cnt = clk->num_real_clocks;
- def->parent_names = malloc(clk->num_real_clocks*sizeof(char *),
- M_OFWPROP, M_WAITOK);
-}
-void
-free_clkdef(struct clknode_init_def *def) {
- OF_prop_free(__DECONST(char *, def->name));
- OF_prop_free(def->parent_names);
-}
diff --git a/sys/arm/ti/clk/ti_clk_clkctrl.c b/sys/arm/ti/clk/ti_clk_clkctrl.c
--- a/sys/arm/ti/clk/ti_clk_clkctrl.c
+++ b/sys/arm/ti/clk/ti_clk_clkctrl.c
@@ -41,7 +41,7 @@
#include "clkdev_if.h"
-#if 0
+#if 1
#define DPRINTF(dev, msg...) device_printf(dev, msg)
#else
#define DPRINTF(dev, msg...)
@@ -102,6 +102,7 @@
sc = clknode_get_softc(clk);
+ DEVICE_LOCK(clk);
READ4(clk, sc->register_offset, &val);
DPRINTF(sc->dev, "val(%x) & (%x | %x = %x)\n",
val, GPIO_X_GDBCLK_MASK, MODULEMODE_MASK,
@@ -129,6 +130,8 @@
DELAY(10);
timeout--;
}
+ DEVICE_UNLOCK(clk);
+
if (timeout == 0) {
device_printf(sc->dev, "ti_clkctrl_set_gdbclk_gate: Timeout\n");
return (1);
@@ -151,7 +154,7 @@
err = ti_clkctrl_set_gdbclk_gate(clk, enable);
return (err);
}
-
+ DEVICE_LOCK(clk);
READ4(clk, sc->register_offset, &val);
if (enable)
@@ -175,6 +178,7 @@
timeout--;
}
+ DEVICE_UNLOCK(clk);
if (timeout == 0) {
device_printf(sc->dev, "ti_clkctrl_set_gate: Timeout\n");
return (1);
diff --git a/sys/arm/ti/clk/ti_divider_clock.c b/sys/arm/ti/clk/ti_divider_clock.c
--- a/sys/arm/ti/clk/ti_divider_clock.c
+++ b/sys/arm/ti/clk/ti_divider_clock.c
@@ -42,12 +42,16 @@
#include <dev/fdt/simplebus.h>
#include <dev/extres/clk/clk_div.h>
+#include <dev/extres/syscon/syscon.h>
#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/ofw_bus_subr.h>
#include "clock_common.h"
-#if 0
+#include "clkdev_if.h"
+#include "syscon_if.h"
+
+#if 1
#define DPRINTF(dev, msg...) device_printf(dev, msg)
#else
#define DPRINTF(dev, msg...)
@@ -60,11 +64,10 @@
struct ti_divider_softc {
device_t sc_dev;
- bool attach_done;
struct clk_div_def div_def;
- struct clock_cell_info clock_cell;
struct clkdom *clkdom;
+ struct syscon *syscon;
};
static int ti_divider_probe(device_t dev);
@@ -81,7 +84,87 @@
{ NULL, TI_DIVIDER_END }
};
+PLIST(dpll_core_m4_ck_parent) = { "dpll_core_x2_ck" };
+PLIST(dpll_core_m5_ck_parent) = { "dpll_core_x2_ck" };
+PLIST(dpll_core_m6_ck_parent) = { "dpll_core_x2_ck" };
+PLIST(dpll_mpu_m2_ck_parent) = { "dpll_mpu_ck@488" };
+PLIST(dpll_ddr_m2_ck_parent) = { "dpll_ddr_ck@494" };
+PLIST(dpll_disp_m2_ck_parent) = { "dpll_disp_ck@498" };
+PLIST(dpll_per_m2_ck_parent) = { "dpll_per_ck@48c" };
+PLIST(gfx_fck_div_ck_parent) = { "gfx_fclk_clksel_ck@52c" };
+PLIST(clkout2_div_ck_parent) = { "sysclkout_pre_ck@700" };
+
+
+static struct parent_lookup_table div_parent_table[] = {
+ { "dpll_core_m4_ck@480", nitems(dpll_core_m4_ck_parent), dpll_core_m4_ck_parent },
+ { "dpll_core_m5_ck@484", nitems(dpll_core_m5_ck_parent), dpll_core_m5_ck_parent },
+ { "dpll_core_m6_ck@4d8", nitems(dpll_core_m6_ck_parent), dpll_core_m6_ck_parent },
+ { "dpll_mpu_m2_ck@4a8", nitems(dpll_mpu_m2_ck_parent), dpll_mpu_m2_ck_parent },
+ { "dpll_ddr_m2_ck@4a0", nitems(dpll_ddr_m2_ck_parent), dpll_ddr_m2_ck_parent },
+ { "dpll_disp_m2_ck@4a4", nitems(dpll_disp_m2_ck_parent), dpll_disp_m2_ck_parent },
+ { "dpll_per_m2_ck@4ac", nitems(dpll_per_m2_ck_parent), dpll_per_m2_ck_parent },
+ { "gfx_fck_div_ck@52c", nitems(gfx_fck_div_ck_parent), gfx_fck_div_ck_parent },
+ { "clkout2_div_ck@700", nitems(clkout2_div_ck_parent), clkout2_div_ck_parent },
+};
+
+
static int
+ti_divider_clkdev_write_4(device_t dev, bus_addr_t addr, uint32_t val)
+{
+ struct ti_divider_softc *sc;
+
+ sc = device_get_softc(dev);
+DPRINTF(sc->sc_dev, "ti_divider_clkdev_write_4: addr %x val %x\n", addr, val);
+ return (SYSCON_UNLOCKED_WRITE_4(sc->syscon, addr, val));
+}
+
+static int
+ti_divider_clkdev_read_4(device_t dev, bus_addr_t addr, uint32_t *val)
+{
+ struct ti_divider_softc *sc;
+ uint32_t rdval;
+
+ sc = device_get_softc(dev);
+
+ rdval = SYSCON_UNLOCKED_READ_4(sc->syscon, addr);
+ *val = rdval;
+DPRINTF(sc->sc_dev, "ti_divider_clkdev_read_4: addr %x val %x\n", addr, *val);
+ return (0);
+}
+
+static int
+ti_divider_clkdev_modify_4(device_t dev, bus_addr_t addr,
+ uint32_t clear_mask, uint32_t set_mask)
+{
+ struct ti_divider_softc *sc;
+
+ sc = device_get_softc(dev);
+DPRINTF(sc->sc_dev, "ti_divider_clkdev_modify_4: addr %x clear %x set %x\n", addr, clear_mask, set_mask);
+ return (SYSCON_UNLOCKED_MODIFY_4(sc->syscon, addr, clear_mask,
+ set_mask));
+}
+
+static void
+ti_divider_clkdev_device_lock(device_t dev)
+{
+ struct ti_divider_softc *sc;
+
+ sc = device_get_softc(dev);
+DPRINTF(sc->sc_dev, "ti_divider_clkdev_device_lock\n");
+ SYSCON_DEVICE_LOCK(sc->syscon->pdev);
+}
+
+static void
+ti_divider_clkdev_device_unlock(device_t dev)
+{
+ struct ti_divider_softc *sc;
+
+ sc = device_get_softc(dev);
+DPRINTF(sc->sc_dev, "ti_divider_clkdev_device_unlock\n");
+ SYSCON_DEVICE_UNLOCK(sc->syscon->pdev);
+}
+
+static int
register_clk(struct ti_divider_softc *sc) {
int err;
@@ -125,14 +208,25 @@
{
struct ti_divider_softc *sc;
phandle_t node;
- int err;
+ int err, index;
cell_t value;
uint32_t ti_max_div;
+ const char *node_name;
sc = device_get_softc(dev);
sc->sc_dev = dev;
node = ofw_bus_get_node(dev);
+ err = SYSCON_GET_HANDLE(dev, &sc->syscon);
+ if (err != 0) {
+ panic("Cannot get syscon handle.\n");
+ }
+
+ node_name = ofw_bus_get_name(dev);
+ if (node_name == NULL) {
+ panic("Cannot get name of the clock node");
+ }
+
/* Grab the content of reg properties */
OF_getencprop(node, "reg", &value, sizeof(value));
sc->div_def.offset = value;
@@ -178,30 +272,33 @@
DPRINTF(sc->sc_dev, "div_def.i_width %x\n", sc->div_def.i_width);
- read_clock_cells(sc->sc_dev, &sc->clock_cell);
+ /* Fill clknode_init_def */
+ ((struct clknode_init_def *)&sc->div_def.clkdef)->id = 1;
+ ((struct clknode_init_def *)&sc->div_def.clkdef)->flags = CLK_NODE_STATIC_STRINGS;
- create_clkdef(sc->sc_dev, &sc->clock_cell, &sc->div_def.clkdef);
+ /* Find parent in lookup table */
+ for (index = 0; index < nitems(div_parent_table); index++) {
+ if (strcmp(node_name, div_parent_table[index].node_name) == 0) {
+ device_printf(dev, "!!! Found %s in lookup table index %d\n",
+ node_name, index);
- err = find_parent_clock_names(sc->sc_dev, &sc->clock_cell, &sc->div_def.clkdef);
-
- if (err) {
- /* free_clkdef will be called in ti_divider_new_pass */
- DPRINTF(sc->sc_dev, "find_parent_clock_names failed\n");
- return (bus_generic_attach(sc->sc_dev));
+ ((struct clknode_init_def *)&sc->div_def.clkdef)->name = div_parent_table[index].node_name;
+ ((struct clknode_init_def *)&sc->div_def.clkdef)->parent_cnt = div_parent_table[index].parent_cnt;
+ ((struct clknode_init_def *)&sc->div_def.clkdef)->parent_names = div_parent_table[index].parent_names;
+ break;
+ }
}
+ if (index == nitems(div_parent_table))
+ panic("Cant find clock %s\n", sc->div_def.clkdef.name);
+
err = register_clk(sc);
- if (err) {
- /* free_clkdef will be called in ti_divider_new_pass */
- DPRINTF(sc->sc_dev, "register_clk failed\n");
- return (bus_generic_attach(sc->sc_dev));
+ if (err != 0) {
+ DPRINTF(sc->sc_dev, "Cannot register clock\n");
+ return (ENXIO);
}
- sc->attach_done = true;
-
- free_clkdef(&sc->div_def.clkdef);
-
return (bus_generic_attach(sc->sc_dev));
}
@@ -211,45 +308,18 @@
return (EBUSY);
}
-static void
-ti_divider_new_pass(device_t dev)
-{
- struct ti_divider_softc *sc;
- int err;
-
- sc = device_get_softc(dev);
-
- if (sc->attach_done) {
- return;
- }
-
- err = find_parent_clock_names(sc->sc_dev, &sc->clock_cell, &sc->div_def.clkdef);
- if (err) {
- /* free_clkdef will be called in a later call to ti_divider_new_pass */
- DPRINTF(sc->sc_dev, "new_pass find_parent_clock_names failed\n");
- return;
- }
-
- err = register_clk(sc);
- if (err) {
- /* free_clkdef will be called in a later call to ti_divider_new_pass */
- DPRINTF(sc->sc_dev, "new_pass register_clk failed\n");
- return;
- }
-
- sc->attach_done = true;
-
- free_clkdef(&sc->div_def.clkdef);
-}
-
static device_method_t ti_divider_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, ti_divider_probe),
DEVMETHOD(device_attach, ti_divider_attach),
DEVMETHOD(device_detach, ti_divider_detach),
- /* Bus interface */
- DEVMETHOD(bus_new_pass, ti_divider_new_pass),
+ /* Clock device interface */
+ DEVMETHOD(clkdev_device_lock, ti_divider_clkdev_device_lock),
+ DEVMETHOD(clkdev_device_unlock, ti_divider_clkdev_device_unlock),
+ DEVMETHOD(clkdev_read_4, ti_divider_clkdev_read_4),
+ DEVMETHOD(clkdev_write_4, ti_divider_clkdev_write_4),
+ DEVMETHOD(clkdev_modify_4, ti_divider_clkdev_modify_4),
DEVMETHOD_END
};
diff --git a/sys/arm/ti/clk/ti_dpll_clock.c b/sys/arm/ti/clk/ti_dpll_clock.c
--- a/sys/arm/ti/clk/ti_dpll_clock.c
+++ b/sys/arm/ti/clk/ti_dpll_clock.c
@@ -48,7 +48,7 @@
#include <arm/ti/clk/ti_clk_dpll.h>
#include "clock_common.h"
-#if 0
+#if 1
#define DPRINTF(dev, msg...) device_printf(dev, msg)
#else
#define DPRINTF(dev, msg...)
@@ -63,10 +63,8 @@
device_t dev;
uint8_t dpll_type;
- bool attach_done;
struct ti_clk_dpll_def dpll_def;
- struct clock_cell_info clock_cell;
struct clkdom *clkdom;
};
@@ -114,6 +112,39 @@
{ NULL, TI_DPLL_END }
};
+
+PLIST(dpll_core_ck_parent) = { "sys_clkin_ck@40", "sys_clkin_ck@40" };
+PLIST(dpll_core_x2_parent) = { "dpll_core_ck@490" };
+
+PLIST(dpll_mpu_ck_parent) = { "sys_clkin_ck@40", "sys_clkin_ck@40" };
+
+PLIST(dpll_ddr_ck_parent) = { "sys_clkin_ck@40", "sys_clkin_ck@40" };
+PLIST(dpll_ddr_m2_div2_ck_parent) = { "dpll_ddr_m2_ck@4a0" };
+
+PLIST(dpll_disp_ck_parent) = { "sys_clkin_ck@40", "sys_clkin_ck@40" };
+
+PLIST(dpll_per_ck_parent) = { "sys_clkin_ck@40", "sys_clkin_ck@40" };
+
+PLIST(dpll_per_m2_div4_wkupdm_ck_parent) = { "dpll_per_m2_ck@4ac" };
+PLIST(dpll_per_m2_div4_ck_parent) = { "dpll_per_m2_ck@4ac" };
+
+static struct parent_lookup_table dpll_parent_table[] = {
+ { "dpll_core_ck@490", nitems(dpll_core_ck_parent), dpll_core_ck_parent },
+ { "dpll_core_x2_ck", nitems(dpll_core_x2_parent), dpll_core_x2_parent },
+
+
+ { "dpll_mpu_ck@488", nitems(dpll_mpu_ck_parent), dpll_mpu_ck_parent },
+
+ { "dpll_ddr_ck@494", nitems(dpll_ddr_ck_parent), dpll_ddr_ck_parent },
+ { "dpll_ddr_m2_div2_ck", nitems(dpll_ddr_m2_div2_ck_parent), dpll_ddr_m2_div2_ck_parent },
+
+ { "dpll_disp_ck@498", nitems(dpll_disp_ck_parent), dpll_disp_ck_parent },
+
+ { "dpll_per_ck@48c", nitems(dpll_per_ck_parent), dpll_per_ck_parent },
+ { "dpll_per_m2_div4_wkupdm_ck", nitems(dpll_per_m2_div4_wkupdm_ck_parent), dpll_per_m2_div4_wkupdm_ck_parent },
+ { "dpll_per_m2_div4_ck", nitems(dpll_per_m2_div4_ck_parent), dpll_per_m2_div4_ck_parent },
+};
+
static int
register_clk(struct ti_dpll_softc *sc) {
int err;
@@ -261,9 +292,10 @@
static int
ti_dpll_attach(device_t dev)
{
- struct ti_dpll_softc *sc;
- phandle_t node;
- int err;
+ struct ti_dpll_softc *sc;
+ phandle_t node;
+ int err, index;
+ const char *node_name;
sc = device_get_softc(dev);
sc->dev = dev;
@@ -271,6 +303,11 @@
sc->dpll_type = ofw_bus_search_compatible(dev, compat_data)->ocd_data;
node = ofw_bus_get_node(dev);
+ node_name = ofw_bus_get_name(dev);
+ if (node_name == NULL) {
+ panic("Cannot get name of the clock node");
+ }
+
/* Grab the content of reg properties */
parse_dpll_reg(sc);
@@ -287,31 +324,33 @@
sc->dpll_def.ti_clkmode_flags |= LOCK_MODE_FLAG;
}
- read_clock_cells(sc->dev, &sc->clock_cell);
+ /* Fill clknode_init_def */
+ ((struct clknode_init_def *)&sc->dpll_def.clkdef)->id = 1;
- create_clkdef(sc->dev, &sc->clock_cell, &sc->dpll_def.clkdef);
+ /* Find parent in lookup table */
+ for (index = 0; index < nitems(dpll_parent_table); index++) {
+ if (strcmp(node_name, dpll_parent_table[index].node_name) == 0) {
+ device_printf(dev, "!!! Found %s in lookup table index %d\n",
+ node_name, index);
- err = find_parent_clock_names(sc->dev, &sc->clock_cell,
- &sc->dpll_def.clkdef);
-
- if (err) {
- /* free_clkdef will be called in ti_dpll_new_pass */
- DPRINTF(sc->dev, "find_parent_clock_names failed\n");
- return (bus_generic_attach(sc->dev));
+ ((struct clknode_init_def *)&sc->dpll_def.clkdef)->name = dpll_parent_table[index].node_name;
+ ((struct clknode_init_def *)&sc->dpll_def.clkdef)->parent_cnt = dpll_parent_table[index].parent_cnt;
+ ((struct clknode_init_def *)&sc->dpll_def.clkdef)->parent_names = dpll_parent_table[index].parent_names;
+ ((struct clknode_init_def *)&sc->dpll_def.clkdef)->flags = CLK_NODE_STATIC_STRINGS;
+ break;
+ }
}
+ if (index == nitems(dpll_parent_table))
+ panic("Cant find clock %s\n", sc->dpll_def.clkdef.name);
+
err = register_clk(sc);
if (err) {
- /* free_clkdef will be called in ti_dpll_new_pass */
DPRINTF(sc->dev, "register_clk failed\n");
return (bus_generic_attach(sc->dev));
}
- sc->attach_done = true;
-
- free_clkdef(&sc->dpll_def.clkdef);
-
return (bus_generic_attach(sc->dev));
}
@@ -321,46 +360,11 @@
return (EBUSY);
}
-static void
-ti_dpll_new_pass(device_t dev)
-{
- struct ti_dpll_softc *sc;
- int err;
-
- sc = device_get_softc(dev);
-
- if (sc->attach_done) {
- return;
- }
-
- err = find_parent_clock_names(sc->dev, &sc->clock_cell,
- &sc->dpll_def.clkdef);
- if (err) {
- /* free_clkdef will be called in a later call to ti_dpll_new_pass */
- DPRINTF(sc->dev,
- "new_pass find_parent_clock_names failed\n");
- return;
- }
-
- err = register_clk(sc);
- if (err) {
- /* free_clkdef will be called in a later call to ti_dpll_new_pass */
- DPRINTF(sc->dev, "new_pass register_clk failed\n");
- return;
- }
-
- sc->attach_done = true;
- free_clkdef(&sc->dpll_def.clkdef);
-}
-
static device_method_t ti_dpll_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, ti_dpll_probe),
DEVMETHOD(device_attach, ti_dpll_attach),
DEVMETHOD(device_detach, ti_dpll_detach),
-
- /* Bus interface */
- DEVMETHOD(bus_new_pass, ti_dpll_new_pass),
DEVMETHOD_END
};
diff --git a/sys/arm/ti/clk/ti_gate_clock.c b/sys/arm/ti/clk/ti_gate_clock.c
--- a/sys/arm/ti/clk/ti_gate_clock.c
+++ b/sys/arm/ti/clk/ti_gate_clock.c
@@ -41,13 +41,16 @@
#include <machine/bus.h>
#include <dev/fdt/simplebus.h>
-#include <dev/extres/clk/clk_gate.h>
#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/extres/clk/clk_gate.h>
+#include <dev/extres/syscon/syscon.h>
#include "clock_common.h"
+#include "clkdev_if.h"
+#include "syscon_if.h"
-#define DEBUG_GATE 0
+#define DEBUG_GATE 1
#if DEBUG_GATE
#define DPRINTF(dev, msg...) device_printf(dev, msg)
@@ -62,12 +65,11 @@
struct ti_gate_softc {
device_t sc_dev;
- bool attach_done;
uint8_t sc_type;
struct clk_gate_def gate_def;
- struct clock_cell_info clock_cell;
struct clkdom *clkdom;
+ struct syscon *syscon;
};
static int ti_gate_probe(device_t dev);
@@ -94,7 +96,81 @@
{ NULL, TI_GATE_END }
};
+PLIST(ehrpwm0_tbclk_parent) = { "l4ls_gclk" };
+PLIST(ehrpwm1_tbclk_parent) = { "l4ls_gclk" };
+PLIST(ehrpwm2_tbclk_parent) = { "l4ls_gclk" };
+PLIST(mmu_fck_parent) = { "dpll_core_m4_ck@480" };
+PLIST(usbotg_fck_parent) = { "dpll_per_ck@48c" };
+PLIST(ieee5000_fck_parent) = { "dpll_core_m4_div2_ck" };
+PLIST(clkout2_ck_parent) = { "clkout2_div_ck@700" };
+
+
+static struct parent_lookup_table gate_parent_table[] = {
+ { "ehrpwm0_tbclk@44e10664", nitems(ehrpwm0_tbclk_parent), ehrpwm0_tbclk_parent },
+ { "ehrpwm1_tbclk@44e10664", nitems(ehrpwm1_tbclk_parent), ehrpwm1_tbclk_parent },
+ { "ehrpwm2_tbclk@44e10664", nitems(ehrpwm2_tbclk_parent), ehrpwm2_tbclk_parent },
+ { "mmu_fck@914", nitems(mmu_fck_parent), mmu_fck_parent },
+ { "usbotg_fck@47c", nitems(usbotg_fck_parent), usbotg_fck_parent },
+ { "ieee5000_fck@e4", nitems(ieee5000_fck_parent), ieee5000_fck_parent },
+ { "clkout2_ck@700", nitems(clkout2_ck_parent), clkout2_ck_parent },
+};
+
+
static int
+ti_gate_clkdev_write_4(device_t dev, bus_addr_t addr, uint32_t val)
+{
+ struct ti_gate_softc *sc;
+
+ sc = device_get_softc(dev);
+DPRINTF(sc->sc_dev, "gate_clkdev_write_4: addr %x val %x\n", addr, val);
+ return (SYSCON_UNLOCKED_WRITE_4(sc->syscon, addr, val));
+}
+
+static int
+ti_gate_clkdev_read_4(device_t dev, bus_addr_t addr, uint32_t *val)
+{
+ struct ti_gate_softc *sc;
+
+ sc = device_get_softc(dev);
+
+ *val = SYSCON_UNLOCKED_READ_4(sc->syscon, addr);
+DPRINTF(sc->sc_dev, "gate_clkdev_write_4: addr %x val %x\n", addr, *val);
+ return (0);
+}
+
+static int
+ti_gate_clkdev_modify_4(device_t dev, bus_addr_t addr,
+ uint32_t clear_mask, uint32_t set_mask)
+{
+ struct ti_gate_softc *sc;
+
+ sc = device_get_softc(dev);
+DPRINTF(sc->sc_dev, "clkdev_modify_4: addr %x clear_mask %x set_mask %x\n", addr, clear_mask, set_mask);
+ return (SYSCON_UNLOCKED_MODIFY_4(sc->syscon, addr, clear_mask,
+ set_mask));
+}
+
+static void
+ti_gate_clkdev_device_lock(device_t dev)
+{
+ struct ti_gate_softc *sc;
+
+ sc = device_get_softc(dev);
+DPRINTF(sc->sc_dev, "ti_gate_clkdev_device_lock\n");
+ SYSCON_DEVICE_LOCK(sc->syscon->pdev);
+}
+
+static void
+ti_gate_clkdev_device_unlock(device_t dev)
+{
+ struct ti_gate_softc *sc;
+
+ sc = device_get_softc(dev);
+DPRINTF(sc->sc_dev, "ti_gate_clkdev_device_unlock\n");
+ SYSCON_DEVICE_UNLOCK(sc->syscon->pdev);
+}
+
+static int
ti_gate_probe(device_t dev)
{
if (!ofw_bus_status_okay(dev))
@@ -111,6 +187,7 @@
static int
register_clk(struct ti_gate_softc *sc) {
int err;
+
sc->clkdom = clkdom_create(sc->sc_dev);
if (sc->clkdom == NULL) {
DPRINTF(sc->sc_dev, "Failed to create clkdom\n");
@@ -136,14 +213,26 @@
ti_gate_attach(device_t dev)
{
struct ti_gate_softc *sc;
- phandle_t node;
- int err;
- cell_t value;
+ phandle_t node;
+ int err, index;
+ cell_t value;
+ const char *node_name;
sc = device_get_softc(dev);
sc->sc_dev = dev;
node = ofw_bus_get_node(dev);
+ /* Get syscon */
+ err = SYSCON_GET_HANDLE(dev, &sc->syscon);
+ if (err != 0) {
+ panic("Cannot get syscon handle.\n");
+ }
+
+ node_name = ofw_bus_get_name(dev);
+ if (node_name == NULL) {
+ panic("Cannot get name of the clock node");
+ }
+
/* Get the compatible type */
sc->sc_type = ofw_bus_search_compatible(dev, compat_data)->ocd_data;
@@ -153,6 +242,7 @@
sc->gate_def.offset = value;
}
#if DEBUG_GATE
+ /* MMEL this looks wrong - sc->gate_def.offset shoul be initialized */
else {
DPRINTF(sc->sc_dev, "no reg (TI_CLKDM_GATE_CLOCK)\n");
}
@@ -176,35 +266,40 @@
sc->gate_def.gate_flags = 0x0;
- read_clock_cells(sc->sc_dev, &sc->clock_cell);
+ /* Fill clknode_init_def */
+ ((struct clknode_init_def *)&sc->gate_def.clkdef)->id = 1;
+ ((struct clknode_init_def *)&sc->gate_def.clkdef)->flags = CLK_NODE_STATIC_STRINGS;
- create_clkdef(sc->sc_dev, &sc->clock_cell, &sc->gate_def.clkdef);
+ /* Find parent in lookup table */
+ for (index = 0; index < nitems(gate_parent_table); index++) {
+ if (strcmp(node_name, gate_parent_table[index].node_name) == 0) {
+ device_printf(dev, "!!! Found %s in lookup table index %d\n",
+ node_name, index);
- /* Calculate mask */
- sc->gate_def.mask = (1 << fls(sc->clock_cell.num_real_clocks)) - 1;
- DPRINTF(sc->sc_dev, "num_real_clocks %x gate_def.mask %x\n",
- sc->clock_cell.num_real_clocks, sc->gate_def.mask);
+ ((struct clknode_init_def *)&sc->gate_def.clkdef)->name = gate_parent_table[index].node_name;
+ ((struct clknode_init_def *)&sc->gate_def.clkdef)->parent_cnt = gate_parent_table[index].parent_cnt;
+ ((struct clknode_init_def *)&sc->gate_def.clkdef)->parent_names = gate_parent_table[index].parent_names;
+ break;
+ }
+ }
- err = find_parent_clock_names(sc->sc_dev, &sc->clock_cell, &sc->gate_def.clkdef);
+ if (index == nitems(gate_parent_table))
+ panic("Cant find clock %s\n", sc->gate_def.clkdef.name);
- if (err) {
- /* free_clkdef will be called in ti_gate_new_pass */
- DPRINTF(sc->sc_dev, "find_parent_clock_names failed\n");
- return (bus_generic_attach(sc->sc_dev));
- }
+ /* Calculate mask */
+ sc->gate_def.mask = (1 << fls(((struct clknode_init_def *)&sc->gate_def.clkdef)->parent_cnt)) - 1;
+ DPRINTF(sc->sc_dev, "num_real_clocks %x gate_def.mask %x\n",
+ ((struct clknode_init_def *)&sc->gate_def.clkdef)->parent_cnt,
+ sc->gate_def.mask);
+
err = register_clk(sc);
- if (err) {
- /* free_clkdef will be called in ti_gate_new_pass */
- DPRINTF(sc->sc_dev, "register_clk failed\n");
- return (bus_generic_attach(sc->sc_dev));
+ if (err != 0) {
+ device_printf(sc->sc_dev, "Cannt register clock\n");
+ return (ENXIO);
}
- sc->attach_done = true;
-
- free_clkdef(&sc->gate_def.clkdef);
-
return (bus_generic_attach(sc->sc_dev));
}
@@ -214,44 +309,18 @@
return (EBUSY);
}
-static void
-ti_gate_new_pass(device_t dev) {
- struct ti_gate_softc *sc;
- int err;
-
- sc = device_get_softc(dev);
-
- if (sc->attach_done) {
- return;
- }
-
- err = find_parent_clock_names(sc->sc_dev, &sc->clock_cell, &sc->gate_def.clkdef);
- if (err) {
- /* free_clkdef will be called in later call to ti_gate_new_pass */
- DPRINTF(sc->sc_dev, "new_pass find_parent_clock_names failed\n");
- return;
- }
-
- err = register_clk(sc);
- if (err) {
- /* free_clkdef will be called in later call to ti_gate_new_pass */
- DPRINTF(sc->sc_dev, "new_pass register_clk failed\n");
- return;
- }
-
- sc->attach_done = true;
-
- free_clkdef(&sc->gate_def.clkdef);
-}
-
static device_method_t ti_gate_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, ti_gate_probe),
DEVMETHOD(device_attach, ti_gate_attach),
DEVMETHOD(device_detach, ti_gate_detach),
- /* Bus interface */
- DEVMETHOD(bus_new_pass, ti_gate_new_pass),
+ /* Clock device interface */
+ DEVMETHOD(clkdev_device_lock, ti_gate_clkdev_device_lock),
+ DEVMETHOD(clkdev_device_unlock, ti_gate_clkdev_device_unlock),
+ DEVMETHOD(clkdev_read_4, ti_gate_clkdev_read_4),
+ DEVMETHOD(clkdev_write_4, ti_gate_clkdev_write_4),
+ DEVMETHOD(clkdev_modify_4, ti_gate_clkdev_modify_4),
DEVMETHOD_END
};
diff --git a/sys/arm/ti/clk/ti_mux_clock.c b/sys/arm/ti/clk/ti_mux_clock.c
--- a/sys/arm/ti/clk/ti_mux_clock.c
+++ b/sys/arm/ti/clk/ti_mux_clock.c
@@ -44,17 +44,56 @@
#include <dev/fdt/simplebus.h>
#include <dev/extres/clk/clk_mux.h>
+#include <dev/extres/syscon/syscon.h>
+
#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/ofw_bus_subr.h>
#include "clock_common.h"
+#include "clkdev_if.h"
+#include "syscon_if.h"
-#if 0
+#if 1
#define DPRINTF(dev, msg...) device_printf(dev, msg)
#else
#define DPRINTF(dev, msg...)
#endif
+
+PLIST(sys_clkin_ck_parent) = { "virt_19200000_ck", "virt_24000000_ck", "virt_25000000_ck", "virt_26000000_ck" };
+PLIST(pruss_ocp_gclk_parent) = { "l3_gclk", "dpll_disp_m2_ck@4a4" };
+PLIST(timer1_fck_parent) = { "sys_clkin_ck@40", "clk-24mhz-clkctrl@14c_0", "tclkin_ck", "clk_rc32k_ck", "clk_32768_ck" };
+PLIST(timer2_fck_parent) = { "tclkin_ck", "sys_clkin_ck@40", "clk-24mhz-clkctrl@14c_0" };
+PLIST(timer3_fck_parent) = { "tclkin_ck", "sys_clkin_ck@40", "clk-24mhz-clkctrl@14c_0" };
+PLIST(timer4_fck_parent) = { "tclkin_ck", "sys_clkin_ck@40", "clk-24mhz-clkctrl@14c_0" };
+PLIST(timer5_fck_parent) = { "tclkin_ck", "sys_clkin_ck@40", "clk-24mhz-clkctrl@14c_0" };
+PLIST(timer6_fck_parent) = { "tclkin_ck", "sys_clkin_ck@40", "clk-24mhz-clkctrl@14c_0" };
+PLIST(timer7_fck_parent) = { "tclkin_ck", "sys_clkin_ck@40", "clk-24mhz-clkctrl@14c_0" };
+PLIST(wdt1_fck_parent) = { "clk_rc32k_ck", "clk-24mhz-clkctrl@14c_0" };
+PLIST(cpsw_cpts_tft_clk_parent) = { "dpll_core_m5_ck@484", "dpll_core_m4_ck@480" };
+PLIST(gpio0_dbclk_mux_ck_parent) = { "clk_rc32k_ck", "clk_32768_ck", "clk-24mhz-clkctrl@14c_0" };
+PLIST(lcd_gclk_parent) = { "dpll_disp_m2_ck@4a4", "dpll_core_m5_ck@484", "dpll_per_m2_ck@4ac" };
+PLIST(gfx_fclk_clksel_ck_parent) = { "dpll_core_m4_ck@480", "dpll_per_m2_ck@4ac" };
+PLIST(sysclkout_pre_ck_parent) = { "clk_32768_ck", "l3_gclk", "dpll_ddr_m2_ck@4a0", "dpll_per_m2_ck@4ac", "lcd_gclk@534" };
+
+static struct parent_lookup_table mux_parent_table[] = {
+ { "sys_clkin_ck@40", nitems(sys_clkin_ck_parent), sys_clkin_ck_parent },
+ { "pruss_ocp_gclk@530", nitems(pruss_ocp_gclk_parent), pruss_ocp_gclk_parent },
+ { "timer1_fck@528", nitems(timer1_fck_parent), timer1_fck_parent },
+ { "timer2_fck@508", nitems(timer2_fck_parent), timer2_fck_parent },
+ { "timer3_fck@50c", nitems(timer3_fck_parent), timer3_fck_parent },
+ { "timer4_fck@510", nitems(timer4_fck_parent), timer4_fck_parent },
+ { "timer5_fck@518", nitems(timer5_fck_parent), timer5_fck_parent },
+ { "timer6_fck@51c", nitems(timer6_fck_parent), timer6_fck_parent },
+ { "timer7_fck@504", nitems(timer7_fck_parent), timer7_fck_parent },
+ { "wdt1_fck@538", nitems(wdt1_fck_parent), wdt1_fck_parent },
+ { "cpsw_cpts_rft_clk@520", nitems(cpsw_cpts_tft_clk_parent), cpsw_cpts_tft_clk_parent },
+ { "gpio0_dbclk_mux_ck@53c", nitems(gpio0_dbclk_mux_ck_parent), gpio0_dbclk_mux_ck_parent },
+ { "lcd_gclk@534", nitems(lcd_gclk_parent), lcd_gclk_parent },
+ { "gfx_fclk_clksel_ck@52c", nitems(gfx_fclk_clksel_ck_parent), gfx_fclk_clksel_ck_parent },
+ { "sysclkout_pre_ck@700", nitems(sysclkout_pre_ck_parent), sysclkout_pre_ck_parent },
+};
+
/*
* Devicetree description
* Documentation/devicetree/bindings/clock/ti/mux.txt
@@ -62,11 +101,10 @@
struct ti_mux_softc {
device_t sc_dev;
- bool attach_done;
struct clk_mux_def mux_def;
- struct clock_cell_info clock_cell;
struct clkdom *clkdom;
+ struct syscon *syscon;
};
static int ti_mux_probe(device_t dev);
@@ -84,6 +122,63 @@
};
static int
+ti_mux_clkdev_write_4(device_t dev, bus_addr_t addr, uint32_t val)
+{
+ struct ti_mux_softc *sc;
+
+ sc = device_get_softc(dev);
+DPRINTF(sc->sc_dev, "mux_clkdev_write_4: addr %x val %x\n", addr, val);
+ return (SYSCON_UNLOCKED_WRITE_4(sc->syscon, addr, val));
+}
+
+static int
+ti_mux_clkdev_read_4(device_t dev, bus_addr_t addr, uint32_t *val)
+{
+ struct ti_mux_softc *sc;
+ uint32_t rdval;
+
+ sc = device_get_softc(dev);
+
+ rdval = SYSCON_UNLOCKED_READ_4(sc->syscon, addr);
+ *val = rdval;
+DPRINTF(sc->sc_dev, "clkdev_read_4: addr %x val %x\n", addr, *val);
+ return (0);
+}
+
+static int
+ti_mux_clkdev_modify_4(device_t dev, bus_addr_t addr,
+ uint32_t clear_mask, uint32_t set_mask)
+{
+ struct ti_mux_softc *sc;
+
+ sc = device_get_softc(dev);
+DPRINTF(sc->sc_dev, "clkdev_modify_4: addr %x clear %x mask %x\n", addr, clear_mask, set_mask);
+ return (SYSCON_UNLOCKED_MODIFY_4(sc->syscon, addr, clear_mask,
+ set_mask));
+}
+
+static void
+ti_mux_clkdev_device_lock(device_t dev)
+{
+ struct ti_mux_softc *sc;
+
+ sc = device_get_softc(dev);
+DPRINTF(sc->sc_dev, "ti_mux_clkdev_device_lock\n");
+ SYSCON_DEVICE_LOCK(sc->syscon->pdev);
+}
+
+static void
+ti_mux_clkdev_device_unlock(device_t dev)
+{
+ struct ti_mux_softc *sc;
+
+ sc = device_get_softc(dev);
+DPRINTF(sc->sc_dev, "ti_mux_clkdev_device_unlock\n");
+ SYSCON_DEVICE_UNLOCK(sc->syscon->pdev);
+}
+
+
+static int
ti_mux_probe(device_t dev)
{
if (!ofw_bus_status_okay(dev))
@@ -126,14 +221,25 @@
ti_mux_attach(device_t dev)
{
struct ti_mux_softc *sc;
- phandle_t node;
- int err;
- cell_t value;
+ phandle_t node;
+ int err, index;
+ cell_t value;
+ const char *node_name;
sc = device_get_softc(dev);
sc->sc_dev = dev;
node = ofw_bus_get_node(dev);
+ err = SYSCON_GET_HANDLE(device_get_parent(dev), &sc->syscon);
+ if (err != 0) {
+ panic("Cannot get syscon handle.\n");
+ }
+
+ node_name = ofw_bus_get_name(dev);
+ if (node_name == NULL) {
+ panic("Cannot get name of the clock node");
+ }
+
/* Grab the content of reg properties */
OF_getencprop(node, "reg", &value, sizeof(value));
sc->mux_def.offset = value;
@@ -154,73 +260,45 @@
if (OF_hasprop(node, "ti,latch-bit"))
device_printf(sc->sc_dev, "ti,latch-bit - Not implemented\n");
- read_clock_cells(sc->sc_dev, &sc->clock_cell);
+ /* Fill clknode_init_def */
+ ((struct clknode_init_def *)&sc->mux_def.clkdef)->id = 1;
+ ((struct clknode_init_def *)&sc->mux_def.clkdef)->flags = CLK_NODE_STATIC_STRINGS;
- create_clkdef(sc->sc_dev, &sc->clock_cell, &sc->mux_def.clkdef);
+ /* Find parent in lookup table */
+ for (index = 0; index < nitems(mux_parent_table); index++) {
+ if (strcmp(node_name, mux_parent_table[index].node_name) == 0) {
+ device_printf(dev, "!!! Found %s in lookup table index %d\n",
+ node_name, index);
+
+ ((struct clknode_init_def *)&sc->mux_def.clkdef)->name = mux_parent_table[index].node_name;
+ ((struct clknode_init_def *)&sc->mux_def.clkdef)->parent_cnt = mux_parent_table[index].parent_cnt;
+ ((struct clknode_init_def *)&sc->mux_def.clkdef)->parent_names = mux_parent_table[index].parent_names;
+ break;
+ }
+ }
+ if (index == nitems(mux_parent_table))
+ panic("Cant find clock %s\n", sc->mux_def.clkdef.name);
+
/* Figure out the width from ti_max_div */
if (sc->mux_def.mux_flags)
- sc->mux_def.width = fls(sc->clock_cell.num_real_clocks-1);
+ sc->mux_def.width = fls(((struct clknode_init_def *)&sc->mux_def.clkdef)->parent_cnt-1);
else
- sc->mux_def.width = fls(sc->clock_cell.num_real_clocks);
+ sc->mux_def.width = fls(((struct clknode_init_def *)&sc->mux_def.clkdef)->parent_cnt);
- DPRINTF(sc->sc_dev, "sc->clock_cell.num_real_clocks %x def.width %x\n",
- sc->clock_cell.num_real_clocks, sc->mux_def.width);
+ DPRINTF(sc->sc_dev, "parents %x def.width %x\n",
+ ((struct clknode_init_def *)&sc->mux_def.clkdef)->parent_cnt, sc->mux_def.width);
- err = find_parent_clock_names(sc->sc_dev, &sc->clock_cell, &sc->mux_def.clkdef);
-
- if (err) {
- /* free_clkdef will be called in ti_mux_new_pass */
- DPRINTF(sc->sc_dev, "find_parent_clock_names failed\n");
- return (bus_generic_attach(sc->sc_dev));
- }
-
err = register_clk(sc);
- if (err) {
- /* free_clkdef will be called in ti_mux_new_pass */
- DPRINTF(sc->sc_dev, "register_clk failed\n");
- return (bus_generic_attach(sc->sc_dev));
+ if (err != 0) {
+ DPRINTF(sc->sc_dev, "Cannot register clock\n");
+ return (ENXIO);
}
- sc->attach_done = true;
-
- free_clkdef(&sc->mux_def.clkdef);
-
return (bus_generic_attach(sc->sc_dev));
}
-static void
-ti_mux_new_pass(device_t dev)
-{
- struct ti_mux_softc *sc;
- int err;
-
- sc = device_get_softc(dev);
-
- if (sc->attach_done) {
- return;
- }
-
- err = find_parent_clock_names(sc->sc_dev, &sc->clock_cell, &sc->mux_def.clkdef);
- if (err) {
- /* free_clkdef will be called in later call to ti_mux_new_pass */
- DPRINTF(sc->sc_dev, "ti_mux_new_pass find_parent_clock_names failed\n");
- return;
- }
-
- err = register_clk(sc);
- if (err) {
- /* free_clkdef will be called in later call to ti_mux_new_pass */
- DPRINTF(sc->sc_dev, "ti_mux_new_pass register_clk failed\n");
- return;
- }
-
- sc->attach_done = true;
-
- free_clkdef(&sc->mux_def.clkdef);
-}
-
static int
ti_mux_detach(device_t dev)
{
@@ -233,8 +311,12 @@
DEVMETHOD(device_attach, ti_mux_attach),
DEVMETHOD(device_detach, ti_mux_detach),
- /* Bus interface */
- DEVMETHOD(bus_new_pass, ti_mux_new_pass),
+ /* Clock device interface */
+ DEVMETHOD(clkdev_device_lock, ti_mux_clkdev_device_lock),
+ DEVMETHOD(clkdev_device_unlock, ti_mux_clkdev_device_unlock),
+ DEVMETHOD(clkdev_read_4, ti_mux_clkdev_read_4),
+ DEVMETHOD(clkdev_write_4, ti_mux_clkdev_write_4),
+ DEVMETHOD(clkdev_modify_4, ti_mux_clkdev_modify_4),
DEVMETHOD_END
};
diff --git a/sys/arm/ti/files.ti b/sys/arm/ti/files.ti
--- a/sys/arm/ti/files.ti
+++ b/sys/arm/ti/files.ti
@@ -5,7 +5,6 @@
arm/ti/ti_prcm.c standard
arm/ti/ti_omap4_cm.c standard
arm/ti/ti_scm.c standard
-arm/ti/ti_scm_syscon.c standard
arm/ti/ti_pinmux.c standard
dev/mbox/mbox_if.m optional ti_mbox
arm/ti/ti_mbox.c optional ti_mbox
@@ -20,7 +19,6 @@
arm/ti/ti_spi.c optional ti_spi
arm/ti/ti_sysc.c standard
-arm/ti/clk/clock_common.c standard
arm/ti/clk/ti_clk_clkctrl.c standard
arm/ti/clk/ti_clkctrl.c standard
arm/ti/clk/ti_clk_dpll.c standard
diff --git a/sys/arm/ti/ti_prcm.c b/sys/arm/ti/ti_prcm.c
--- a/sys/arm/ti/ti_prcm.c
+++ b/sys/arm/ti/ti_prcm.c
@@ -40,18 +40,14 @@
#include <sys/bus.h>
#include <sys/kernel.h>
#include <sys/module.h>
-#include <sys/malloc.h>
+#include <sys/mutex.h>
#include <sys/rman.h>
-#include <sys/timeet.h>
-#include <sys/timetc.h>
-#include <sys/watchdog.h>
#include <machine/bus.h>
-#include <machine/cpu.h>
-#include <machine/intr.h>
#include <arm/ti/ti_cpuid.h>
#include <arm/ti/ti_prcm.h>
#include <arm/ti/tivar.h>
+#include <arm/ti/clk/clock_common.h>
#include <dev/fdt/simplebus.h>
@@ -59,22 +55,23 @@
#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/extres/clk/clk.h>
+#include <dev/extres/clk/clk_link.h>
+#include <dev/extres/syscon/syscon.h>
+#include <dev/extres/syscon/syscon_generic.h>
+
+#include "syscon_if.h"
#include "clkdev_if.h"
-#if 0
+#if 1
#define DPRINTF(dev, msg...) device_printf(dev, msg)
#else
#define DPRINTF(dev, msg...)
#endif
struct ti_prcm_softc {
- struct simplebus_softc sc_simplebus;
- device_t dev;
- struct resource * mem_res;
- bus_space_tag_t bst;
- bus_space_handle_t bsh;
- int attach_done;
- struct mtx mtx;
+ struct syscon_generic_softc *syscon_generic;
+ struct clkdom *clkdom;
};
static struct ti_prcm_softc *ti_prcm_sc = NULL;
@@ -123,63 +120,183 @@
{ NULL, TI_PRCM_END}
};
+static struct clk_link_def scm_clocks[] = {
+ LINK("sys_clkin_ck@40"),
+ LINK("adc_tsc_fck"),
+ LINK("dcan0_fck"),
+ LINK("dcan1_fck"),
+ LINK("mcasp0_fck"),
+ LINK("mcasp1_fck"),
+ LINK("smartreflex0_fck"),
+ LINK("smartreflex1_fck"),
+ LINK("sha0_fck"),
+ LINK("aes0_fck"),
+ LINK("rng_fck"),
+ LINK("ehrpwm0_tbclk@44e10664"),
+ LINK("ehrpwm1_tbclk@44e10664"),
+ LINK("ehrpwm2_tbclk@44e10664"),
+};
+
+static struct clk_link_def per_cm_0[] = {
+ LINK("l4ls-clkctrl@38_0"),
+ LINK("l4ls-clkctrl@38_4"),
+ LINK("l4ls-clkctrl@38_8"),
+ LINK("l4ls-clkctrl@38_c"),
+ LINK("l4ls-clkctrl@38_10"),
+ LINK("l4ls-clkctrl@38_14"),
+ LINK("l4ls-clkctrl@38_18"),
+ LINK("l4ls-clkctrl@38_1c"),
+ LINK("l4ls-clkctrl@38_20"),
+ LINK("l4ls-clkctrl@38_24"),
+ LINK("l4ls-clkctrl@38_28"),
+ LINK("l4ls-clkctrl@38_34"),
+ LINK("l4ls-clkctrl@38_38"),
+ LINK("l4ls-clkctrl@38_3c"),
+ LINK("l4ls-clkctrl@38_40"),
+ LINK("l4ls-clkctrl@38_44"),
+ LINK("l4ls-clkctrl@38_48"),
+ LINK("l4ls-clkctrl@38_4c"),
+ LINK("l4ls-clkctrl@38_50"),
+ LINK("l4ls-clkctrl@38_54"),
+ LINK("l4ls-clkctrl@38_58"),
+ LINK("l4ls-clkctrl@38_74"),
+ LINK("l4ls-clkctrl@38_75"),
+ LINK("l4ls-clkctrl@38_78"),
+ LINK("l4ls-clkctrl@38_79"),
+ LINK("l4ls-clkctrl@38_7c"),
+ LINK("l4ls-clkctrl@38_7d"),
+ LINK("l4ls-clkctrl@38_88"),
+ LINK("l4ls-clkctrl@38_8c"),
+ LINK("l4ls-clkctrl@38_90"),
+ LINK("l4ls-clkctrl@38_94"),
+ LINK("l4ls-clkctrl@38_98"),
+ LINK("l4ls-clkctrl@38_9c"),
+ LINK("l4ls-clkctrl@38_a0"),
+ LINK("l4ls-clkctrl@38_b4"),
+ LINK("l4ls-clkctrl@38_b8"),
+ LINK("l4ls-clkctrl@38_bc"),
+ LINK("l4ls-clkctrl@38_d4"),
+ LINK("l4ls-clkctrl@38_d8"),
+ LINK("l4ls-clkctrl@38_f8"),
+
+ LINK("l3s-clkctrl@1c_0"),
+ LINK("l3s-clkctrl@1c_14"),
+ LINK("l3s-clkctrl@1c_18"),
+ LINK("l3s-clkctrl@1c_4c"),
+ LINK("l3s-clkctrl@1c_dc"),
+
+ LINK("l3-clkctrl@24_0"),
+ LINK("l3-clkctrl@24_4"),
+ LINK("l3-clkctrl@24_8"),
+ LINK("l3-clkctrl@24_70"),
+ LINK("l3-clkctrl@24_74"),
+ LINK("l3-clkctrl@24_78"),
+ LINK("l3-clkctrl@24_7c"),
+ LINK("l3-clkctrl@24_98"),
+ LINK("l3-clkctrl@24_bc"),
+ LINK("l3-clkctrl@24_d8"),
+ LINK("l3-clkctrl@24_dc"),
+
+ LINK("l4hs-clkctrl@120_0"),
+
+ LINK("pruss-ocp-clkctrl@e8_0"),
+
+ LINK("cpsw-125mhz-clkctrl@0_0"),
+ LINK("cpsw-125mhz-clkctrl@0_4"),
+ LINK("cpsw-125mhz-clkctrl@0_8"),
+ LINK("cpsw-125mhz-clkctrl@0_c"),
+ LINK("cpsw-125mhz-clkctrl@0_10"),
+ LINK("cpsw-125mhz-clkctrl@0_14"),
+
+ LINK("lcdc-clkctrl@18_0"),
+
+ LINK("clk-24mhz-clkctrl@14c_0"),
+
+ LINK("l4-wkup-clkctrl@0_0"),
+ LINK("l4-wkup-clkctrl@0_4"),
+ LINK("l4-wkup-clkctrl@0_8"),
+ LINK("l4-wkup-clkctrl@0_9"),
+ LINK("l4-wkup-clkctrl@0_c"),
+ LINK("l4-wkup-clkctrl@0_b4"),
+ LINK("l4-wkup-clkctrl@0_b8"),
+ LINK("l4-wkup-clkctrl@0_bc"),
+ LINK("l4-wkup-clkctrl@0_c0"),
+ LINK("l4-wkup-clkctrl@0_c4"),
+ LINK("l4-wkup-clkctrl@0_c8"),
+ LINK("l4-wkup-clkctrl@0_cc"),
+ LINK("l4-wkup-clkctrl@0_d0"),
+ LINK("l4-wkup-clkctrl@0_d4"),
+
+ LINK("l3-aon-clkctrl@14_0"),
+ LINK("l4-wkup-aon-clkctrl@b0_0"),
+
+ LINK("mpu-clkctrl@0_0"),
+ LINK("mpu-clkctrl@0_4"),
+
+ LINK("l4-rtc-clkctrl@0_0"),
+
+ LINK("gfx-l3-clkctrl@0_0"),
+ LINK("gfx-l3-clkctrl@0_4"),
+
+ LINK("l4-cefuse-clkctrl@0_0"),
+ LINK("l4-cefuse-clkctrl@0_4"),
+ LINK("l4-cefuse-clkctrl@0_8"),
+ LINK("l4-cefuse-clkctrl@0_c"),
+ LINK("l4-cefuse-clkctrl@0_10"),
+ LINK("l4-cefuse-clkctrl@0_14"),
+ LINK("l4-cefuse-clkctrl@0_18"),
+ LINK("l4-cefuse-clkctrl@0_1c"),
+ LINK("l4-cefuse-clkctrl@0_20"),
+};
+
static int
ti_prcm_probe(device_t dev)
{
if (!ofw_bus_status_okay(dev))
return (ENXIO);
- if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0) {
+ if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
return (ENXIO);
- }
device_set_desc(dev, "TI Power and Clock Management");
- return(BUS_PROBE_DEFAULT);
+ return (BUS_PROBE_DEFAULT);
}
static int
-ti_prcm_attach(device_t dev)
-{
- struct ti_prcm_softc *sc;
- phandle_t node, child;
- int rid;
+ti_prcm_attach(device_t dev) {
+ int i, err, ret;
+ struct ti_prcm_softc *prcm_sc;
- sc = device_get_softc(dev);
- sc->dev = dev;
- node = ofw_bus_get_node(sc->dev);
- simplebus_init(sc->dev, node);
+ device_printf(dev, "ti_prcm_attach\n");
+ prcm_sc = device_get_softc(dev);
- if (simplebus_fill_ranges(node, &sc->sc_simplebus) < 0) {
- device_printf(sc->dev, "could not get ranges\n");
- return (ENXIO);
- }
- if (sc->sc_simplebus.nranges == 0) {
- device_printf(sc->dev, "nranges == 0\n");
- return (ENXIO);
- }
+ prcm_sc->clkdom = clkdom_create(dev);
+ if (prcm_sc->clkdom == NULL)
+ panic("Cannot create clkdom\n");
- sc->mem_res = bus_alloc_resource(sc->dev, SYS_RES_MEMORY, &rid,
- sc->sc_simplebus.ranges[0].host,
- (sc->sc_simplebus.ranges[0].host +
- sc->sc_simplebus.ranges[0].size - 1),
- sc->sc_simplebus.ranges[0].size,
- RF_ACTIVE | RF_SHAREABLE);
+ for (i = 0; i < nitems(scm_clocks); i++) {
+ err = clknode_link_register(prcm_sc->clkdom,
+ &scm_clocks[i]);
+ if (err != 0)
+ device_printf(dev, "Cant create clock link %s\n",
+ scm_clocks[i].clkdef.name);
- if (sc->mem_res == NULL) {
- return (ENXIO);
}
+ for (i = 0; i < nitems(per_cm_0); i++) {
+ err = clknode_link_register(prcm_sc->clkdom,
+ &per_cm_0[i]);
+ if (err != 0)
+ device_printf(dev, "Cant create clock link %s\n",
+ per_cm_0[i].clkdef.name);
+ }
- sc->bst = rman_get_bustag(sc->mem_res);
- sc->bsh = rman_get_bushandle(sc->mem_res);
+ if (clkdom_finit(prcm_sc->clkdom) != 0)
+ panic("cannot finalize clkdom initialization\n");
- mtx_init(&sc->mtx, device_get_nameunit(dev), NULL, MTX_DEF);
+ /* Setup reset handler */
+ ti_prcm_sc = prcm_sc;
- /* Fixme: for xxx_prcm_reset functions.
- * Get rid of global variables?
- */
- ti_prcm_sc = sc;
-
switch(ti_chip()) {
#ifdef SOC_OMAP4
case CHIP_OMAP_4:
@@ -193,32 +310,29 @@
#endif
}
- bus_generic_probe(sc->dev);
- for (child = OF_child(node); child != 0; child = OF_peer(child)) {
- simplebus_add_device(dev, child, 0, NULL, -1, NULL);
- }
-
- return (bus_generic_attach(sc->dev));
+ ret = syscon_generic_attach(dev);
+ return (ret);
}
int
ti_prcm_write_4(device_t dev, bus_addr_t addr, uint32_t val)
{
- struct ti_prcm_softc *sc;
+ struct syscon_generic_softc *sc;
sc = device_get_softc(dev);
- DPRINTF(sc->dev, "offset=%lx write %x\n", addr, val);
- bus_space_write_4(sc->bst, sc->bsh, addr, val);
- return (0);
+ DPRINTF(sc->dev, "ti_prcm_write_4: offset=%lx write %x\n", addr, val);
+ return (SYSCON_UNLOCKED_WRITE_4(sc->syscon, addr, val));
}
int
ti_prcm_read_4(device_t dev, bus_addr_t addr, uint32_t *val)
{
- struct ti_prcm_softc *sc;
+ struct syscon_generic_softc *sc;
sc = device_get_softc(dev);
- *val = bus_space_read_4(sc->bst, sc->bsh, addr);
+DPRINTF(sc->dev, "ti_prcm_read_4: addr %x\n", addr);
+
+ *val = SYSCON_UNLOCKED_READ_4(sc->syscon, addr);
DPRINTF(sc->dev, "offset=%lx Read %x\n", addr, *val);
return (0);
}
@@ -226,39 +340,37 @@
int
ti_prcm_modify_4(device_t dev, bus_addr_t addr, uint32_t clr, uint32_t set)
{
- struct ti_prcm_softc *sc;
- uint32_t reg;
+ struct syscon_generic_softc *sc;
sc = device_get_softc(dev);
-
- reg = bus_space_read_4(sc->bst, sc->bsh, addr);
- reg &= ~clr;
- reg |= set;
- bus_space_write_4(sc->bst, sc->bsh, addr, reg);
- DPRINTF(sc->dev, "offset=%lx reg: %x (clr %x set %x)\n", addr, reg, clr, set);
-
- return (0);
+DPRINTF(sc->dev, "ti_prcm_modify_4: addr %x clear_mask %x set_mask %x\n", addr, clr, set);
+ return (SYSCON_UNLOCKED_MODIFY_4(sc->syscon, addr, clr,
+ set));
}
void
ti_prcm_device_lock(device_t dev)
{
- struct ti_prcm_softc *sc;
+ struct syscon_generic_softc *sc;
+DPRINTF(dev, "ti_prcm_device_lock\n");
sc = device_get_softc(dev);
- mtx_lock(&sc->mtx);
+ SYSCON_DEVICE_LOCK(sc->syscon->pdev);
}
void
ti_prcm_device_unlock(device_t dev)
{
- struct ti_prcm_softc *sc;
+ struct syscon_generic_softc *sc;
+DPRINTF(dev, "ti_prcm_device_unlock\n");
sc = device_get_softc(dev);
- mtx_unlock(&sc->mtx);
+
+ SYSCON_DEVICE_UNLOCK(sc->syscon->pdev);
}
static device_method_t ti_prcm_methods[] = {
+ /* Device interface */
DEVMETHOD(device_probe, ti_prcm_probe),
DEVMETHOD(device_attach, ti_prcm_attach),
@@ -273,16 +385,18 @@
};
DEFINE_CLASS_1(ti_prcm, ti_prcm_driver, ti_prcm_methods,
- sizeof(struct ti_prcm_softc), simplebus_driver);
+ sizeof(struct ti_prcm_softc), syscon_generic_driver);
+ //sizeof(struct syscon_generic_softc), syscon_generic_driver);
static devclass_t ti_prcm_devclass;
-EARLY_DRIVER_MODULE(ti_prcm, ofwbus, ti_prcm_driver,
+EARLY_DRIVER_MODULE(ti_prcm, syscon_generic_dev, ti_prcm_driver,
ti_prcm_devclass, 0, 0, BUS_PASS_BUS);
EARLY_DRIVER_MODULE(ti_prcm, simplebus, ti_prcm_driver,
ti_prcm_devclass, 0, 0, BUS_PASS_BUS + BUS_PASS_ORDER_MIDDLE);
+
MODULE_VERSION(ti_prcm, 1);
-MODULE_DEPEND(ti_prcm, ti_scm, 1, 1, 1);
+MODULE_DEPEND(ti_prcm, syscon_generic_dev, 1, 1, 1);
/* From sys/arm/ti/am335x/am335x_prcm.c
* Copyright (c) 2012 Damjan Marion <dmarion@Freebsd.org>
@@ -293,7 +407,11 @@
static void
am335x_prcm_reset(void)
{
- ti_prcm_write_4(ti_prcm_sc->dev, AM335x_PRM_RSTCTRL, (1<<1));
+ device_t dev = ((struct syscon_generic_softc *)ti_prcm_sc)->dev;
+
+ ti_prcm_device_lock(dev);
+ ti_prcm_write_4(dev, AM335x_PRM_RSTCTRL, (1<<1));
+ ti_prcm_device_unlock(dev);
}
/* FIXME: Is this correct - or should the license part be ontop? */
@@ -336,9 +454,12 @@
omap4_prcm_reset(void)
{
uint32_t reg;
+ device_t dev = ((struct syscon_generic_softc *)ti_prcm_sc)->dev;
- ti_prcm_read_4(ti_prcm_sc->dev, PRM_RSTCTRL, ®);
+ ti_prcm_device_lock(dev);
+ ti_prcm_read_4(dev, PRM_RSTCTRL, ®);
reg = reg | PRM_RSTCTRL_RESET;
- ti_prcm_write_4(ti_prcm_sc->dev, PRM_RSTCTRL, reg);
- ti_prcm_read_4(ti_prcm_sc->dev, PRM_RSTCTRL, ®);
+ ti_prcm_write_4(dev, PRM_RSTCTRL, reg);
+ ti_prcm_read_4(dev, PRM_RSTCTRL, ®);
+ ti_prcm_device_unlock(dev);
}
diff --git a/sys/arm/ti/ti_prm.c b/sys/arm/ti/ti_prm.c
--- a/sys/arm/ti/ti_prm.c
+++ b/sys/arm/ti/ti_prm.c
@@ -42,10 +42,13 @@
#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/extres/syscon/syscon.h>
#include <arm/ti/ti_prcm.h>
#include <arm/ti/ti_prm.h>
-#if 0
+#include "syscon_if.h"
+
+#if 1
#define DPRINTF(dev, msg...) device_printf(dev, msg)
#else
#define DPRINTF(dev, msg...)
@@ -58,6 +61,7 @@
device_t dev;
uint8_t type;
bool has_reset;
+ struct syscon *syscon;
};
/* Device */
@@ -106,6 +110,7 @@
{
struct ti_prm_softc *sc;
phandle_t node;
+ int err;
sc = device_get_softc(dev);
sc->dev = dev;
@@ -113,6 +118,12 @@
node = ofw_bus_get_node(sc->dev);
+ err = SYSCON_GET_HANDLE(dev, &sc->syscon);
+ if (err != 0) {
+ panic("Cannot get syscon handle.\n");
+ return (ENXIO);
+ }
+
if (OF_hasprop(node, "#reset-cells")) {
sc->has_reset = true;
} else
@@ -139,56 +150,9 @@
if (sc->has_reset == false)
return 1;
- err = ti_prm_modify_4(dev, TI_PRM_PER_RSTCTRL, 0x2, 0x00);
- return (err);
-}
+ err = SYSCON_MODIFY_4(sc->syscon, TI_PRM_PER_RSTCTRL, 0x2, 0x00);
-int
-ti_prm_write_4(device_t dev, bus_addr_t addr, uint32_t val)
-{
- struct ti_prm_softc *sc;
- device_t parent;
-
- parent = device_get_parent(dev);
- sc = device_get_softc(dev);
- DPRINTF(sc->dev, "offset=%lx write %x\n", addr, val);
- ti_prcm_device_lock(parent);
- ti_prcm_write_4(parent, addr, val);
- ti_prcm_device_unlock(parent);
- return (0);
-}
-
-int
-ti_prm_read_4(device_t dev, bus_addr_t addr, uint32_t *val)
-{
- struct ti_prm_softc *sc;
- device_t parent;
-
- parent = device_get_parent(dev);
- sc = device_get_softc(dev);
-
- ti_prcm_device_lock(parent);
- ti_prcm_read_4(parent, addr, val);
- ti_prcm_device_unlock(parent);
- DPRINTF(sc->dev, "offset=%lx Read %x\n", addr, *val);
- return (0);
-}
-
-int
-ti_prm_modify_4(device_t dev, bus_addr_t addr, uint32_t clr, uint32_t set)
-{
- struct ti_prm_softc *sc;
- device_t parent;
-
- parent = device_get_parent(dev);
- sc = device_get_softc(dev);
-
- ti_prcm_device_lock(parent);
- ti_prcm_modify_4(parent, addr, clr, set);
- ti_prcm_device_unlock(parent);
- DPRINTF(sc->dev, "offset=%lx (clr %x set %x)\n", addr, clr, set);
-
- return (0);
+ return (err);
}
static device_method_t ti_prm_methods[] = {
diff --git a/sys/arm/ti/ti_scm_syscon.c b/sys/arm/ti/ti_scm_syscon.c
--- a/sys/arm/ti/ti_scm_syscon.c
+++ b/sys/arm/ti/ti_scm_syscon.c
@@ -1,298 +0,0 @@
-/*-
- * Copyright (c) 2019 Emmanuel Vadot <manu@FreeBSD.org>
- *
- * Copyright (c) 2020 Oskar Holmlund <oskar.holmlund@ohdata.se>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-/* Based on sys/arm/ti/ti_sysc.c */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/module.h>
-#include <sys/bus.h>
-#include <sys/resource.h>
-#include <sys/rman.h>
-#include <sys/lock.h>
-#include <sys/mutex.h>
-
-#include <machine/bus.h>
-#include <machine/resource.h>
-
-#include <dev/fdt/simplebus.h>
-
-#include <dev/ofw/openfirm.h>
-#include <dev/ofw/ofw_bus.h>
-#include <dev/ofw/ofw_bus_subr.h>
-
-#include "syscon_if.h"
-#include <dev/extres/syscon/syscon.h>
-#include "clkdev_if.h"
-
-#include <arm/ti/ti_cpuid.h>
-
-#if 0
-#define DPRINTF(dev, msg...) device_printf(dev, msg)
-#else
-#define DPRINTF(dev, msg...)
-#endif
-
-MALLOC_DECLARE(M_SYSCON);
-
-struct ti_scm_syscon_softc {
- struct simplebus_softc sc_simplebus;
- device_t dev;
- struct syscon * syscon;
- struct resource * res[1];
- bus_space_tag_t bst;
- bus_space_handle_t bsh;
- struct mtx mtx;
-};
-
-static struct resource_spec ti_scm_syscon_res_spec[] = {
- { SYS_RES_MEMORY, 0, RF_ACTIVE | RF_SHAREABLE },
- { -1, 0 }
-};
-
-/* Device */
-static struct ofw_compat_data compat_data[] = {
- { "syscon", 1 },
- { NULL, 0 }
-};
-
-/* --- dev/extres/syscon syscon_method_t interface --- */
-static int
-ti_scm_syscon_write_4(struct syscon *syscon, bus_size_t offset, uint32_t val)
-{
- struct ti_scm_syscon_softc *sc;
-
- sc = device_get_softc(syscon->pdev);
- DPRINTF(sc->dev, "offset=%lx write %x\n", offset, val);
- mtx_lock(&sc->mtx);
- bus_space_write_4(sc->bst, sc->bsh, offset, val);
- mtx_unlock(&sc->mtx);
- return (0);
-}
-
-static uint32_t
-ti_scm_syscon_read_4(struct syscon *syscon, bus_size_t offset)
-{
- struct ti_scm_syscon_softc *sc;
- uint32_t val;
-
- sc = device_get_softc(syscon->pdev);
-
- mtx_lock(&sc->mtx);
- val = bus_space_read_4(sc->bst, sc->bsh, offset);
- mtx_unlock(&sc->mtx);
- DPRINTF(sc->dev, "offset=%lx Read %x\n", offset, val);
- return (val);
-}
-static int
-ti_scm_syscon_modify_4(struct syscon *syscon, bus_size_t offset, uint32_t clr, uint32_t set)
-{
- struct ti_scm_syscon_softc *sc;
- uint32_t reg;
-
- sc = device_get_softc(syscon->pdev);
-
- mtx_lock(&sc->mtx);
- reg = bus_space_read_4(sc->bst, sc->bsh, offset);
- reg &= ~clr;
- reg |= set;
- bus_space_write_4(sc->bst, sc->bsh, offset, reg);
- mtx_unlock(&sc->mtx);
- DPRINTF(sc->dev, "offset=%lx reg: %x (clr %x set %x)\n", offset, reg, clr, set);
-
- return (0);
-}
-
-static syscon_method_t ti_scm_syscon_reg_methods[] = {
- SYSCONMETHOD(syscon_read_4, ti_scm_syscon_read_4),
- SYSCONMETHOD(syscon_write_4, ti_scm_syscon_write_4),
- SYSCONMETHOD(syscon_modify_4, ti_scm_syscon_modify_4),
-
- SYSCONMETHOD_END
-};
-
-DEFINE_CLASS_1(ti_scm_syscon_reg, ti_scm_syscon_reg_class, ti_scm_syscon_reg_methods,
- 0, syscon_class);
-
-/* device interface */
-static int
-ti_scm_syscon_probe(device_t dev)
-{
- if (!ofw_bus_status_okay(dev))
- return (ENXIO);
-
- if (!ti_soc_is_supported())
- return (ENXIO);
-
- if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
- return (ENXIO);
-
- device_set_desc(dev, "TI OMAP Control Module Syscon");
- return(BUS_PROBE_DEFAULT);
-}
-
-static int
-ti_scm_syscon_attach(device_t dev)
-{
- struct ti_scm_syscon_softc *sc;
- phandle_t node, child;
- int err;
-
- sc = device_get_softc(dev);
- sc->dev = dev;
-
- if (bus_alloc_resources(dev, ti_scm_syscon_res_spec, sc->res)) {
- device_printf(sc->dev, "Cant allocate resources\n");
- return (ENXIO);
- }
-
- sc->dev = dev;
- sc->bst = rman_get_bustag(sc->res[0]);
- sc->bsh = rman_get_bushandle(sc->res[0]);
-
- mtx_init(&sc->mtx, device_get_nameunit(sc->dev), NULL, MTX_DEF);
- node = ofw_bus_get_node(sc->dev);
-
- /* dev/extres/syscon interface */
- sc->syscon = syscon_create_ofw_node(dev, &ti_scm_syscon_reg_class, node);
- if (sc->syscon == NULL) {
- device_printf(dev, "Failed to create/register syscon\n");
- return (ENXIO);
- }
-
- simplebus_init(sc->dev, node);
-
- err = bus_generic_probe(sc->dev);
- for (child = OF_child(node); child != 0; child = OF_peer(child)) {
- simplebus_add_device(sc->dev, child, 0, NULL, -1, NULL);
- }
-
- return (bus_generic_attach(sc->dev));
-}
-
-/* syscon interface */
-static int
-ti_scm_syscon_get_handle(device_t dev, struct syscon **syscon)
-{
- struct ti_scm_syscon_softc *sc;
-
- sc = device_get_softc(dev);
- *syscon = sc->syscon;
- if (*syscon == NULL)
- return (ENODEV);
- return (0);
-}
-
-/* clkdev interface */
-static int
-ti_scm_syscon_clk_write_4(device_t dev, bus_addr_t addr, uint32_t val)
-{
- struct ti_scm_syscon_softc *sc;
-
- sc = device_get_softc(dev);
- DPRINTF(sc->dev, "offset=%lx write %x\n", addr, val);
- bus_space_write_4(sc->bst, sc->bsh, addr, val);
- return (0);
-}
-
-static int
-ti_scm_syscon_clk_read_4(device_t dev, bus_addr_t addr, uint32_t *val)
-{
- struct ti_scm_syscon_softc *sc;
-
- sc = device_get_softc(dev);
-
- *val = bus_space_read_4(sc->bst, sc->bsh, addr);
- DPRINTF(sc->dev, "offset=%lx Read %x\n", addr, *val);
- return (0);
-}
-
-static int
-ti_scm_syscon_clk_modify_4(device_t dev, bus_addr_t addr, uint32_t clr, uint32_t set)
-{
- struct ti_scm_syscon_softc *sc;
- uint32_t reg;
-
- sc = device_get_softc(dev);
-
- reg = bus_space_read_4(sc->bst, sc->bsh, addr);
- reg &= ~clr;
- reg |= set;
- bus_space_write_4(sc->bst, sc->bsh, addr, reg);
- DPRINTF(sc->dev, "offset=%lx reg: %x (clr %x set %x)\n", addr, reg, clr, set);
-
- return (0);
-}
-
-static void
-ti_scm_syscon_clk_device_lock(device_t dev)
-{
- struct ti_scm_syscon_softc *sc;
-
- sc = device_get_softc(dev);
- mtx_lock(&sc->mtx);
-}
-
-static void
-ti_scm_syscon_clk_device_unlock(device_t dev)
-{
- struct ti_scm_syscon_softc *sc;
- sc = device_get_softc(dev);
- mtx_unlock(&sc->mtx);
-}
-
-static device_method_t ti_scm_syscon_methods[] = {
- DEVMETHOD(device_probe, ti_scm_syscon_probe),
- DEVMETHOD(device_attach, ti_scm_syscon_attach),
-
- /* syscon interface */
- DEVMETHOD(syscon_get_handle, ti_scm_syscon_get_handle),
-
- /* clkdev interface */
- DEVMETHOD(clkdev_write_4, ti_scm_syscon_clk_write_4),
- DEVMETHOD(clkdev_read_4, ti_scm_syscon_clk_read_4),
- DEVMETHOD(clkdev_modify_4, ti_scm_syscon_clk_modify_4),
- DEVMETHOD(clkdev_device_lock, ti_scm_syscon_clk_device_lock),
- DEVMETHOD(clkdev_device_unlock, ti_scm_syscon_clk_device_unlock),
-
- DEVMETHOD_END
-};
-
-DEFINE_CLASS_1(ti_scm_syscon, ti_scm_syscon_driver, ti_scm_syscon_methods,
- sizeof(struct ti_scm_syscon_softc), simplebus_driver);
-
-static devclass_t ti_scm_syscon_devclass;
-
-EARLY_DRIVER_MODULE(ti_scm_syscon, simplebus, ti_scm_syscon_driver,
- ti_scm_syscon_devclass, 0, 0, BUS_PASS_BUS + BUS_PASS_ORDER_MIDDLE);
-MODULE_VERSION(ti_scm_syscon, 1);
-MODULE_DEPEND(ti_scm_syscon, ti_scm, 1, 1, 1);
diff --git a/sys/arm/ti/ti_sysc.c b/sys/arm/ti/ti_sysc.c
--- a/sys/arm/ti/ti_sysc.c
+++ b/sys/arm/ti/ti_sysc.c
@@ -55,7 +55,7 @@
#include <arm/ti/ti_sysc.h>
#include <arm/ti/clk/clock_common.h>
-#define DEBUG_SYSC 0
+#define DEBUG_SYSC 1
#if DEBUG_SYSC
#define DPRINTF(dev, msg...) device_printf(dev, msg)
@@ -112,6 +112,128 @@
{ NULL, TI_SYSC_END }
};
+PLIST(target_module_7000) = { "l4-wkup-clkctrl@0_8", "l4-wkup-clkctrl@0_9" }; /* gpio0 */
+PLIST(target_module_9000) = { "l4-wkup-clkctrl@0_b4" }; /* uart0 */
+PLIST(target_module_b000) = { "l4-wkup-clkctrl@0_b8" }; /* i2c1 */
+PLIST(target_module_d000) = { "l4-wkup-clkctrl@0_bc" }; /* adc_tsc */
+PLIST(target_module_31000) = { "l4-wkup-clkctrl@0_c4" }; /* timer1 */
+PLIST(target_module_35000) = { "l4-wkup-clkctrl@0_d4" }; /* timer2 */
+
+PLIST(target_module_3e000) = { "l4-rtc-clkctrl@0_0" }; /* rtc */
+
+PLIST(target_module_100000) = { "cpsw-125mhz-clkctrl@0_14" }; /* cpsw (ethernet) */
+
+PLIST(target_module_300000) = { "pruss-ocp-clkctrl@e8_0" }; /* pru */
+
+PLIST(target_module_22000) = { "l4ls-clkctrl@38_34" }; /* uart2 */
+PLIST(target_module_24000) = { "l4ls-clkctrl@38_38" }; /* uart3 */
+PLIST(target_module_2a000) = { "l4ls-clkctrl@38_10" }; /* i2c2 */
+PLIST(target_module_30000) = { "l4ls-clkctrl@38_14" }; /* spi0 */
+
+PLIST(target_module_38000) = { "l3s-clkctrl@1c_18" }; /* mcasp0 */
+PLIST(target_module_3c000) = { "l3s-clkctrl@1c_4c" }; /* mcasp1 */
+
+PLIST(target_module_40000) = { "l4ls-clkctrl@38_48" }; /* timer2 */
+PLIST(target_module_42000) = { "l4ls-clkctrl@38_4c" }; /* timer3 */
+PLIST(target_module_44000) = { "l4ls-clkctrl@38_50" }; /* timer4 */
+PLIST(target_module_46000) = { "l4ls-clkctrl@38_b4" }; /* timer5 */
+PLIST(target_module_48000) = { "l4ls-clkctrl@38_b8" }; /* timer6 */
+PLIST(target_module_4a000) = { "l4ls-clkctrl@38_44" }; /* timer7 */
+PLIST(target_module_4c000) = { "l4ls-clkctrl@38_74", "l4ls-clkctrl@38_75" }; /* gpio2 */
+PLIST(target_module_60000) = { "l4ls-clkctrl@38_4" }; /* mmc1 */
+PLIST(target_module_80000) = { "l4ls-clkctrl@38_8" }; /* elm */
+PLIST(target_module_c8000) = { "l4ls-clkctrl@38_d8" }; /* mailbox */
+PLIST(target_module_ca000) = { "l4ls-clkctrl@38_d4" }; /* spinlock */
+PLIST(target_module_9c000) = { "l4ls-clkctrl@38_c" }; /* i2c3 */
+PLIST(target_module_a0000) = { "l4ls-clkctrl@38_18" }; /* spi1 */
+PLIST(target_module_a6000) = { "l4ls-clkctrl@38_3c" }; /* uart4 */
+PLIST(target_module_a8000) = { "l4ls-clkctrl@38_40" }; /* uart5 */
+PLIST(target_module_aa000) = { "l4ls-clkctrl@38_0" }; /* uart6 */
+PLIST(target_module_ac000) = { "l4ls-clkctrl@38_78", "l4ls-clkctrl@38_79" }; /* gpio3 */
+PLIST(target_module_ae000) = { "l4ls-clkctrl@38_7c", "l4ls-clkctrl@38_7d" }; /* gpio4 */
+PLIST(target_module_cc000) = { "l4ls-clkctrl@38_88" }; /* dcan0 */
+PLIST(target_module_d0000) = { "l4ls-clkctrl@38_8c" }; /* dcan1 */
+PLIST(target_module_d8000) = { "l4ls-clkctrl@38_bc" }; /* mmc2 */
+PLIST(target_module_0) = { "l4ls-clkctrl@38_9c" }; /* epwmss0 */
+PLIST(target_module_2000) = { "l4ls-clkctrl@38_94" }; /* epwmss1 */
+PLIST(target_module_4000) = { "l4ls-clkctrl@38_a0" }; /* epwmss2 */
+
+PLIST(target_module_e000) = { "lcdc-clkctrl@18_0" }; /* lcdc */
+
+PLIST(target_module_10000) = { "l4ls-clkctrl@38_58" }; /* rng */
+
+PLIST(target_module_49000000) = { "l3-clkctrl@24_98" }; /* tpcc */
+PLIST(target_module_49800000) = { "l3-clkctrl@24_0" }; /* tptco */
+PLIST(target_module_49900000) = { "l3-clkctrl@24_d8" }; /* tptc1 */
+PLIST(target_module_49a00000) = { "l3-clkctrl@24_dc" }; /* tptc2 */
+PLIST(target_module_47810000) = { "l3s-clkctrl@1c_dc" }; /* mmc3 */
+PLIST(target_module_47400000) = { "l3s-clkctrl@1c_0" }; /* usb otg hs */
+PLIST(target_module_53100000) = { "l3-clkctrl@24_7c" }; /* sham */
+PLIST(target_module_53500000) = { "l3-clkctrl@24_70" }; /* aes */
+PLIST(target_module_56000000) = { "gfx-l3-clkctrl@0_4" }; /* gfx */
+
+
+static struct parent_lookup_table sysc_clock_table[] = {
+ { "target-module@7000", nitems(target_module_7000), target_module_7000 },
+ { "target-module@9000", nitems(target_module_9000), target_module_9000 },
+ { "target-module@b000", nitems(target_module_b000), target_module_b000 },
+ { "target-module@d000", nitems(target_module_d000), target_module_d000 },
+ { "target-module@31000", nitems(target_module_31000), target_module_31000 },
+ { "target-module@35000", nitems(target_module_35000), target_module_35000 },
+
+ { "target-module@3e000", nitems(target_module_3e000), target_module_3e000 },
+
+ { "target-module@100000", nitems(target_module_100000), target_module_100000 },
+ { "target-module@300000", nitems(target_module_300000), target_module_300000 },
+
+ { "target-module@22000", nitems(target_module_22000), target_module_22000 },
+ { "target-module@24000", nitems(target_module_24000), target_module_24000 },
+ { "target-module@2a000", nitems(target_module_2a000), target_module_2a000 },
+ { "target-module@30000", nitems(target_module_30000), target_module_30000 },
+
+ { "target-module@38000", nitems(target_module_38000), target_module_38000 },
+ { "target-module@3c000", nitems(target_module_3c000), target_module_3c000 },
+
+ { "target-module@40000", nitems(target_module_40000), target_module_40000 },
+ { "target-module@42000", nitems(target_module_42000), target_module_42000 },
+ { "target-module@44000", nitems(target_module_44000), target_module_44000 },
+ { "target-module@46000", nitems(target_module_46000), target_module_46000 },
+ { "target-module@48000", nitems(target_module_48000), target_module_48000 },
+ { "target-module@4a000", nitems(target_module_4a000), target_module_4a000 },
+ { "target-module@4c000", nitems(target_module_4c000), target_module_4c000 },
+ { "target-module@60000", nitems(target_module_60000), target_module_60000 },
+ { "target-module@80000", nitems(target_module_80000), target_module_80000 },
+ { "target-module@c8000", nitems(target_module_c8000), target_module_c8000 },
+ { "target-module@ca000", nitems(target_module_ca000), target_module_ca000 },
+ { "target-module@9c000", nitems(target_module_9c000), target_module_9c000 },
+ { "target-module@a0000", nitems(target_module_a0000), target_module_a0000 },
+ { "target-module@a6000", nitems(target_module_a6000), target_module_a6000 },
+ { "target-module@a8000", nitems(target_module_a8000), target_module_a8000 },
+ { "target-module@aa000", nitems(target_module_aa000), target_module_aa000 },
+ { "target-module@ac000", nitems(target_module_ac000), target_module_ac000 },
+ { "target-module@ae000", nitems(target_module_ae000), target_module_ae000 },
+ { "target-module@cc000", nitems(target_module_cc000), target_module_cc000 },
+ { "target-module@d0000", nitems(target_module_d0000), target_module_d0000 },
+ { "target-module@d8000", nitems(target_module_d8000), target_module_d8000 },
+ { "target-module@0", nitems(target_module_0), target_module_0 },
+ { "target-module@2000", nitems(target_module_2000), target_module_2000 },
+ { "target-module@4000", nitems(target_module_4000), target_module_4000 },
+
+ { "target-module@e000", nitems(target_module_e000), target_module_e000 },
+ { "target-module@10000", nitems(target_module_10000), target_module_10000 },
+
+ { "target-module@49000000", nitems(target_module_49000000), target_module_49000000 },
+ { "target-module@49800000", nitems(target_module_49800000), target_module_49800000 },
+ { "target-module@49900000", nitems(target_module_49900000), target_module_49900000 },
+ { "target-module@49a00000", nitems(target_module_49a00000), target_module_49a00000 },
+ { "target-module@47810000", nitems(target_module_47810000), target_module_47810000 },
+ { "target-module@47400000", nitems(target_module_47400000), target_module_47400000 },
+ { "target-module@53100000", nitems(target_module_53100000), target_module_53100000 },
+ { "target-module@53500000", nitems(target_module_53500000), target_module_53500000 },
+ { "target-module@56000000", nitems(target_module_56000000), target_module_56000000 },
+};
+
+
/* reg-names can be "rev", "sysc" and "syss" */
static const char * reg_names[] = { "rev", "sysc", "syss" };
#define REG_REV 0
@@ -135,7 +257,6 @@
struct ti_sysc_softc {
struct simplebus_softc sc;
- bool attach_done;
device_t dev;
int device_type;
@@ -243,6 +364,9 @@
int err;
TAILQ_FOREACH_SAFE(clkp, &sc->clk_list, next, clkp_tmp) {
+DPRINTF(sc->dev, "clk_enable %s\n",
+ clk_get_name(clkp->clk));
+
err = clk_enable(clkp->clk);
if (err) {
@@ -395,6 +519,7 @@
idle[i] = -1;
}
+#if 0
static int
ti_sysc_attach_clocks(struct ti_sysc_softc *sc) {
clk_t *clk;
@@ -418,6 +543,7 @@
/* All clocks are found, add to list */
for (index = 0; index < sc->num_clocks; index++) {
+ struct clk_list *clkp;
clkp = malloc(sizeof(*clkp), M_DEVBUF, M_WAITOK | M_ZERO);
clkp->clk = clk[index];
TAILQ_INSERT_TAIL(&sc->clk_list, clkp, next);
@@ -427,6 +553,7 @@
free(clk, M_DEVBUF);
return (0);
}
+#endif
static int
ti_sysc_simplebus_attach_child(device_t dev) {
@@ -533,20 +660,49 @@
sc->ti_no_idle);
if (OF_hasprop(node, "clocks")) {
- struct clock_cell_info cell_info;
- read_clock_cells(sc->dev, &cell_info);
- free(cell_info.clock_cells, M_DEVBUF);
- free(cell_info.clock_cells_ncells, M_DEVBUF);
+ int index;
+ const char *name = ofw_bus_get_name(dev);
+device_printf(dev, "%s has clock\n", name);
- sc->num_clocks = cell_info.num_real_clocks;
- TAILQ_INIT(&sc->clk_list);
+ for (index = 0; index < nitems(sysc_clock_table); index++) {
+ if (strcmp(sysc_clock_table[index].node_name, name) == 0) {
+ device_printf(dev, "!!! Found %s in lookup table index %d\n", name, index);
+ break;
+ }
+ }
- err = ti_sysc_attach_clocks(sc);
- if (err) {
- DPRINTF(sc->dev, "Failed to attach clocks\n");
- return (bus_generic_attach(sc->dev));
+ if (index < nitems(sysc_clock_table)) {
+ /*
+ * Found the correct place in the lookup table.
+ * Loop through and get the clocks
+ */
+ int clk_index;
+
+ TAILQ_INIT(&sc->clk_list);
+ sc->num_clocks = sysc_clock_table[index].parent_cnt;
+ for (clk_index = 0 ; clk_index < sysc_clock_table[index].parent_cnt; clk_index++) {
+ struct clk_list *clkp;
+ clkp = malloc(sizeof(*clkp), M_DEVBUF, M_WAITOK | M_ZERO);
+ //clkp->clk = clk[index];
+#if 0
+ err = clk_get_by_ofw_name(dev, node,
+ sysc_clock_table[index].parent_names[clk_index],
+ &clkp->clk);
+#endif
+ err = clk_get_by_name(dev,
+ sysc_clock_table[index].parent_names[clk_index],
+ &clkp->clk);
+ if (err != 0)
+ panic("Cant get clock %s err %d",
+ sysc_clock_table[index].parent_names[clk_index],
+ err);
+
+ TAILQ_INSERT_TAIL(&sc->clk_list, clkp, next);
+ }
+ } else {
+ panic("Cant find clocks for node %s\n", name);
}
- }
+ }
err = ti_sysc_simplebus_attach_child(sc->dev);
if (err) {
@@ -555,8 +711,6 @@
return (err);
}
- sc->attach_done = true;
-
return (bus_generic_attach(sc->dev));
}
@@ -566,49 +720,11 @@
return (EBUSY);
}
-/* Bus interface */
-static void
-ti_sysc_new_pass(device_t dev)
-{
- struct ti_sysc_softc *sc;
- int err;
- phandle_t node;
-
- sc = device_get_softc(dev);
-
- if (sc->attach_done) {
- bus_generic_new_pass(sc->dev);
- return;
- }
-
- node = ofw_bus_get_node(sc->dev);
- if (OF_hasprop(node, "clocks")) {
- err = ti_sysc_attach_clocks(sc);
- if (err) {
- DPRINTF(sc->dev, "Failed to attach clocks\n");
- return;
- }
- }
-
- err = ti_sysc_simplebus_attach_child(sc->dev);
- if (err) {
- DPRINTF(sc->dev,
- "ti_sysc_simplebus_attach_child failed %d\n", err);
- return;
- }
- sc->attach_done = true;
-
- bus_generic_attach(sc->dev);
-}
-
static device_method_t ti_sysc_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, ti_sysc_probe),
DEVMETHOD(device_attach, ti_sysc_attach),
DEVMETHOD(device_detach, ti_sysc_detach),
-
- /* Bus interface */
- DEVMETHOD(bus_new_pass, ti_sysc_new_pass),
DEVMETHOD_END
};
diff --git a/sys/dev/extres/syscon/syscon_generic.h b/sys/dev/extres/syscon/syscon_generic.h
--- a/sys/dev/extres/syscon/syscon_generic.h
+++ b/sys/dev/extres/syscon/syscon_generic.h
@@ -40,6 +40,8 @@
bool simplebus_attached;
};
+int syscon_generic_attach(device_t dev);
+
DECLARE_CLASS(syscon_generic_driver);
#endif /* DEV_SYSCON_GENERIC_H */
diff --git a/sys/dev/extres/syscon/syscon_generic.c b/sys/dev/extres/syscon/syscon_generic.c
--- a/sys/dev/extres/syscon/syscon_generic.c
+++ b/sys/dev/extres/syscon/syscon_generic.c
@@ -161,7 +161,7 @@
return (BUS_PROBE_GENERIC);
}
-static int
+int
syscon_generic_attach(device_t dev)
{
struct syscon_generic_softc *sc;
@@ -218,12 +218,27 @@
return (0);
}
+static int
+syscon_generic_get_handle(device_t dev, struct syscon **syscon)
+{
+ struct syscon_generic_softc *sc;
+
+ sc = device_get_softc(dev);
+ *syscon = sc->syscon;
+ if (*syscon == NULL)
+ return (ENODEV);
+ return (0);
+}
+
static device_method_t syscon_generic_dmethods[] = {
/* Device interface */
DEVMETHOD(device_probe, syscon_generic_probe),
DEVMETHOD(device_attach, syscon_generic_attach),
DEVMETHOD(device_detach, syscon_generic_detach),
+ /* syscon interface */
+ DEVMETHOD(syscon_get_handle, syscon_generic_get_handle),
+
DEVMETHOD(syscon_device_lock, syscon_generic_lock),
DEVMETHOD(syscon_device_unlock, syscon_generic_unlock),
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Apr 23, 5:35 PM (2 h, 48 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
32036141
Default Alt Text
D27889.id81607.diff (71 KB)
Attached To
Mode
D27889: TI SoC rework clk support
Attached
Detach File
Event Timeline
Log In to Comment