| // 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_ |