blob: ce3d223f5d4584801ec6266883eaec8e21fadc83 [file] [log] [blame]
// Copyright 2019 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 ZIRCON_SYSTEM_DEV_CLK_SYN_CLK_SYN_CLK_H_
#define ZIRCON_SYSTEM_DEV_CLK_SYN_CLK_SYN_CLK_H_
#include <ddktl/device.h>
#include <ddktl/protocol/clockimpl.h>
#include <fbl/mutex.h>
#include <lib/mmio/mmio.h>
#include <lib/zircon-internal/thread_annotations.h>
#include <soc/as370/as370-clk.h>
namespace clk {
class SynClk;
using DeviceType = ddk::Device<SynClk, ddk::Unbindable>;
class SynClk : public DeviceType, public ddk::ClockImplProtocol<SynClk, ddk::base_protocol> {
public:
static zx_status_t Create(void* ctx, zx_device_t* parent);
// Clock Protocol Implementation
zx_status_t ClockImplEnable(uint32_t index);
zx_status_t ClockImplDisable(uint32_t index);
zx_status_t ClockImplIsEnabled(uint32_t id, bool* out_enabled);
zx_status_t ClockImplSetRate(uint32_t id, uint64_t hz);
zx_status_t ClockImplQuerySupportedRate(uint32_t id, uint64_t max_rate, uint64_t* out_best_rate);
zx_status_t ClockImplGetRate(uint32_t id, uint64_t* out_current_rate);
// Device Protocol Implementation.
zx_status_t Bind();
void DdkUnbind();
void DdkRelease();
// Protected for unit tests.
protected:
SynClk(zx_device_t* parent, ddk::MmioBuffer global_mmio, ddk::MmioBuffer avio_mmio)
: DeviceType(parent),
global_mmio_(std::move(global_mmio)),
avio_mmio_(std::move(avio_mmio)) {}
private:
zx_status_t AvpllClkEnable(bool avpll0, bool enable);
zx_status_t AvpllSetRate(bool avpll0, uint64_t rate);
fbl::Mutex lock_;
ddk::MmioBuffer global_mmio_ TA_GUARDED(lock_);
ddk::MmioBuffer avio_mmio_ TA_GUARDED(lock_);
};
} // namespace clk
#endif // ZIRCON_SYSTEM_DEV_CLK_SYN_CLK_SYN_CLK_H_