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