Lines Matching +full:parent +full:- +full:clk

4  * Copyright GreenSocs 2016-2020
11 * See the COPYING file in the top-level directory.
21 #define CLOCK_PATH(_clk) (_clk->canonical_path)
23 void clock_setup_canonical_path(Clock *clk) in clock_setup_canonical_path() argument
25 g_free(clk->canonical_path); in clock_setup_canonical_path()
26 clk->canonical_path = object_get_canonical_path(OBJECT(clk)); in clock_setup_canonical_path()
29 Clock *clock_new(Object *parent, const char *name) in clock_new() argument
32 Clock *clk; in clock_new() local
35 object_property_add_child(parent, name, obj); in clock_new()
38 clk = CLOCK(obj); in clock_new()
39 clock_setup_canonical_path(clk); in clock_new()
41 return clk; in clock_new()
44 void clock_set_callback(Clock *clk, ClockCallback *cb, void *opaque, in clock_set_callback() argument
47 assert(OBJECT(clk)->parent); in clock_set_callback()
48 clk->callback = cb; in clock_set_callback()
49 clk->callback_opaque = opaque; in clock_set_callback()
50 clk->callback_events = events; in clock_set_callback()
53 bool clock_set(Clock *clk, uint64_t period) in clock_set() argument
55 if (clk->period == period) { in clock_set()
58 trace_clock_set(CLOCK_PATH(clk), CLOCK_PERIOD_TO_HZ(clk->period), in clock_set()
60 clk->period = period; in clock_set()
65 static uint64_t clock_get_child_period(Clock *clk) in clock_get_child_period() argument
68 * Return the period to be used for child clocks, which is the parent in clock_get_child_period()
71 return muldiv64(clk->period, clk->multiplier, clk->divider); in clock_get_child_period()
74 static void clock_call_callback(Clock *clk, ClockEvent event) in clock_call_callback() argument
80 if (clk->callback && (clk->callback_events & event)) { in clock_call_callback()
81 clk->callback(clk->callback_opaque, event); in clock_call_callback()
85 static void clock_propagate_period(Clock *clk, bool call_callbacks) in clock_propagate_period() argument
88 uint64_t child_period = clock_get_child_period(clk); in clock_propagate_period()
90 QLIST_FOREACH(child, &clk->children, sibling) { in clock_propagate_period()
91 if (child->period != child_period) { in clock_propagate_period()
95 child->period = child_period; in clock_propagate_period()
96 trace_clock_update(CLOCK_PATH(child), CLOCK_PATH(clk), in clock_propagate_period()
97 CLOCK_PERIOD_TO_HZ(child->period), in clock_propagate_period()
107 void clock_propagate(Clock *clk) in clock_propagate() argument
109 trace_clock_propagate(CLOCK_PATH(clk)); in clock_propagate()
110 clock_propagate_period(clk, true); in clock_propagate()
113 void clock_set_source(Clock *clk, Clock *src) in clock_set_source() argument
116 assert(!clk->source); in clock_set_source()
118 trace_clock_set_source(CLOCK_PATH(clk), CLOCK_PATH(src)); in clock_set_source()
120 clk->period = clock_get_child_period(src); in clock_set_source()
121 QLIST_INSERT_HEAD(&src->children, clk, sibling); in clock_set_source()
122 clk->source = src; in clock_set_source()
123 clock_propagate_period(clk, false); in clock_set_source()
126 static void clock_disconnect(Clock *clk) in clock_disconnect() argument
128 if (clk->source == NULL) { in clock_disconnect()
132 trace_clock_disconnect(CLOCK_PATH(clk)); in clock_disconnect()
134 clk->source = NULL; in clock_disconnect()
135 QLIST_REMOVE(clk, sibling); in clock_disconnect()
138 char *clock_display_freq(Clock *clk) in clock_display_freq() argument
140 return freq_to_str(clock_get_hz(clk)); in clock_display_freq()
143 bool clock_set_mul_div(Clock *clk, uint32_t multiplier, uint32_t divider) in clock_set_mul_div() argument
147 if (clk->multiplier == multiplier && clk->divider == divider) { in clock_set_mul_div()
151 trace_clock_set_mul_div(CLOCK_PATH(clk), clk->multiplier, multiplier, in clock_set_mul_div()
152 clk->divider, divider); in clock_set_mul_div()
153 clk->multiplier = multiplier; in clock_set_mul_div()
154 clk->divider = divider; in clock_set_mul_div()
162 Clock *clk = CLOCK(obj); in clock_period_prop_get() local
163 uint64_t period = clock_get(clk); in clock_period_prop_get()
170 * Callback are registered by the parent, which might die anytime after in clock_unparent()
180 Clock *clk = CLOCK(obj); in clock_initfn() local
182 clk->multiplier = 1; in clock_initfn()
183 clk->divider = 1; in clock_initfn()
185 QLIST_INIT(&clk->children); in clock_initfn()
188 object_property_add(obj, "qtest-clock-period", "uint64", in clock_initfn()
195 Clock *clk = CLOCK(obj); in clock_finalizefn() local
199 QLIST_FOREACH_SAFE(child, &clk->children, sibling, next) { in clock_finalizefn()
204 clock_disconnect(clk); in clock_finalizefn()
206 g_free(clk->canonical_path); in clock_finalizefn()
211 klass->unparent = clock_unparent; in clock_class_init()
216 .parent = TYPE_OBJECT,