// 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.
library fuchsia.hardware.clockimpl;

using zx;

/// Each method in this protocol has a corresponding method in clock.banjo
/// with an additional ID parameter.
/// The ID parameter in each method below designates the clock in the system
/// that the call is intended to target.
/// Conversely, each instance of ZX_PROTOCOL_CLOCK pertains to only one clock
/// in the system.
/// See clock.banjo for documentation for each method.
@transport("Banjo")
@banjo_layout("ddk-protocol")
protocol ClockImpl {
    /// Clock Gating Control.
    Enable(struct {
        id uint32;
    }) -> (struct {
        s zx.status;
    });
    Disable(struct {
        id uint32;
    }) -> (struct {
        s zx.status;
    });
    IsEnabled(struct {
        id uint32;
    }) -> (struct {
        s zx.status;
        enabled bool;
    });

    /// Clock Frequency Scaling Control.
    SetRate(struct {
        id uint32;
        hz uint64;
    }) -> (struct {
        s zx.status;
    });
    QuerySupportedRate(struct {
        id uint32;
        hz uint64;
    }) -> (struct {
        s zx.status;
        hz uint64;
    });
    GetRate(struct {
        id uint32;
    }) -> (struct {
        s zx.status;
        hz uint64;
    });

    /// Clock input control.
    SetInput(struct {
        id uint32;
        idx uint32;
    }) -> (struct {
        s zx.status;
    });
    GetNumInputs(struct {
        id uint32;
    }) -> (struct {
        s zx.status;
        n uint32;
    });
    GetInput(struct {
        id uint32;
    }) -> (struct {
        s zx.status;
        index uint32;
    });
};
