1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #pragma once
6 
7 #include <ddktl/device.h>
8 #include <ddktl/mmio.h>
9 #include <ddktl/protocol/clk.h>
10 #include <zircon/device/clk.h>
11 
12 namespace clk {
13 
14 class MtkClk;
15 using DeviceType = ddk::Device<MtkClk, ddk::Ioctlable>;
16 
17 class MtkClk : public DeviceType, public ddk::ClkProtocol<MtkClk, ddk::base_protocol> {
18 public:
19     static zx_status_t Create(zx_device_t* parent);
20 
DdkRelease()21     void DdkRelease() { delete this; }
22 
23     zx_status_t Bind();
24 
25     zx_status_t ClkEnable(uint32_t index);
26     zx_status_t ClkDisable(uint32_t index);
27 
28     zx_status_t DdkIoctl(uint32_t op, const void* in_buf,
29                          size_t in_len, void* out_buf,
30                          size_t out_len, size_t* out_actual);
31 
32 private:
MtkClk(zx_device_t * parent,ddk::MmioBuffer mmio)33     MtkClk(zx_device_t* parent, ddk::MmioBuffer mmio)
34         : DeviceType(parent), mmio_(std::move(mmio)) {}
35 
36     zx_status_t ClkMeasure(uint32_t clk, clk_freq_info_t* info);
37 
38     ddk::MmioBuffer mmio_;
39 };
40 
41 }  // namespace clk
42