20#include "pw_assert/assert.h"
21#include "pw_clock_tree/clock_tree.h"
22#include "pw_status/status.h"
23#include "pw_status/try.h"
32template <
typename ElementType>
35 static constexpr clock_attach_id_t kNoSelector =
36 static_cast<clock_attach_id_t
>(0);
48 template <
typename SourceType>
50 SourceType& initial_source,
51 clock_attach_id_t initial_selector,
52 clock_attach_id_t disable_selector = kNoSelector)
54 current_selector_(initial_selector),
55 disable_selector_(disable_selector) {
56 PW_ASSERT(initial_selector != kNoSelector);
59 template <
typename SourceType>
60 pw::Status ChangeSource(SourceType& new_source,
61 clock_attach_id_t new_selector) {
62 PW_ASSERT(new_selector != kNoSelector);
64 std::lock_guard lock(this->lock());
66 if (this->current_selector_ == new_selector) {
69 Element& current_source = this->source();
82 const bool is_enabled = (this->ref_count() > 0);
83 const bool always_on_mux = (disable_selector_ == kNoSelector);
85 if (is_enabled || always_on_mux) {
92 bool acquired_temp_current_ref =
false;
94 PW_TRY(current_source.Acquire());
95 acquired_temp_current_ref =
true;
101 if constexpr (SourceType::kMayFail) {
102 if (
pw::Status status = new_source.Acquire(); !status.
ok()) {
103 if (acquired_temp_current_ref) {
104 current_source.Release().IgnoreError();
109 new_source.Acquire();
113 CLOCK_AttachClk(new_selector);
119 current_source.Release().IgnoreError();
125 if constexpr (SourceType::kMayFail) {
126 new_source.Release().IgnoreError();
128 new_source.Release();
137 current_selector_ = new_selector;
143 clock_attach_id_t current_selector_;
144 const clock_attach_id_t disable_selector_;
151 PW_ASSERT(current_selector_ != kNoSelector);
152 CLOCK_AttachClk(current_selector_);
157 if (disable_selector_ != kNoSelector) {
158 CLOCK_AttachClk(disable_selector_);
constexpr bool ok() const
Definition: status.h:346
Definition: sync_selector.h:33
constexpr ClockMcuxpressoSyncSelector(SourceType &initial_source, clock_attach_id_t initial_selector, clock_attach_id_t disable_selector=kNoSelector)
Definition: sync_selector.h:49
Definition: clock_tree.h:338
void SetSource(SourceType &source)
Definition: clock_tree.h:405
#define PW_TRY(expr)
Returns early if expr is a non-OK Status or Result.
Definition: try.h:27
constexpr Status OkStatus()
Definition: status.h:450
Clock tree management library.
Definition: clock_tree.h:30