| // Copyright 2020 The Fuchsia Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef CLOCKTREE_BASECLOCK_H_ | |
| #define CLOCKTREE_BASECLOCK_H_ | |
| #include <stdint.h> | |
| #include <zircon/types.h> | |
| #include "types.h" | |
| namespace clk { | |
| // BaseClock is a base class that clock implementers should inherit from to implement | |
| // various clock types. | |
| // The Tree class accepts an array of BaseClock*s which represent a clock tree. | |
| // | |
| // See `clocktree-test.cc` for example usage. | |
| class BaseClock { | |
| public: | |
| BaseClock(const char* name, const uint32_t id) : name_(name), id_(id), enable_count_(0) {} | |
| virtual ~BaseClock() {} | |
| /// Clock Gating Control. | |
| virtual zx_status_t Enable() = 0; | |
| virtual zx_status_t Disable() = 0; | |
| virtual zx_status_t IsHwEnabled(bool* out) = 0; | |
| zx_status_t IsEnabled(bool* out); | |
| // Clock frequency control. | |
| virtual zx_status_t SetRate(const Hertz rate, const Hertz parent_rate) = 0; | |
| virtual zx_status_t QuerySupportedRate(const Hertz max, const Hertz parent_rate, Hertz* out) = 0; | |
| virtual zx_status_t GetRate(const Hertz parent_rate, Hertz* out) = 0; | |
| // Clock Mux Control. | |
| virtual zx_status_t SetInput(const uint32_t index) = 0; | |
| virtual zx_status_t GetNumInputs(uint32_t* out) = 0; | |
| virtual zx_status_t GetInput(uint32_t* out) = 0; | |
| virtual zx_status_t GetInputId(const uint32_t index, uint32_t* id) = 0; | |
| // Accessors. | |
| const char* Name() const { return name_; } | |
| uint32_t Id() const { return id_; } | |
| virtual uint32_t ParentId() = 0; | |
| uint32_t EnableCount() { return enable_count_; } | |
| void SetEnableCount(uint32_t enable_count) { enable_count_ = enable_count; } | |
| private: | |
| const char* name_; | |
| const uint32_t id_; | |
| uint32_t enable_count_; | |
| }; | |
| } // namespace clk | |
| #endif // CLOCKTREE_BASECLOCK_H_ |