// 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 ddk.protocol.pwm;

using zx;

struct PwmConfig {
   bool polarity;
   uint32 period_ns;
   /// duty_cycle range: [0.0, 100.0]
   float32 duty_cycle;
   /// TODO(41256): Vendor extensions
   /// mode_config should be mode specific parameters. The first parameter should always be mode.
   /// For example, a PWM supporting regular mode and 2 timer mode should have:
   ///   struct mode_config_regular {};
   ///
   ///   struct mode_config_two_timer {
   ///     uint32_t period_ns2;
   ///     float duty_cycle2;
   ///     uint8_t timer1;
   ///     uint8_t timer2;
   ///   };
   ///
   ///   struct mode_config {
   ///     uint32_t mode;
   ///     union {
   ///       struct mode_config_regular regular;
   ///       struct mode_config_two_timer two_timer;
   ///     };
   ///   };
   vector<voidptr>? mode_config;
};

[Layout = "ddk-protocol"]
protocol Pwm {
    /// Gets the current config of the PWM.
    /// @Returns : |s| : ZX_OK if success.
    /// @Returns : |config| : current config of PWM.
    GetConfig() -> (zx.status s, PwmConfig config);

    /// Sets the configurations of the PWM
    /// |config| : Configurations.
    /// @Returns : |s| : ZX_OK if success.
    SetConfig(PwmConfig config) -> (zx.status s);

    /// Enables the PWM.
    /// @Returns : |s| : ZX_OK if success.
    Enable() -> (zx.status s);

    /// Disables the PWM.
    /// @Returns : |s| : ZX_OK  if success.
    Disable() -> (zx.status s);
};

[Layout = "ddk-protocol"]
protocol PwmImpl {
    /// Gets the current config of the PWM.
    /// |idx| : Index of requested PWM.
    /// @Returns: |s| : ZX_OK if success.
    /// @Returns : |config| : current config of PWM.
    GetConfig(uint32 idx) -> (zx.status s, PwmConfig config);

    /// Sets the configurations of the PWM.
    /// |idx| : Index of requested PWM.
    /// |config| : Configurations.
    /// @Returns : |s| : ZX_OK if success.
    SetConfig(uint32 idx, PwmConfig config) -> (zx.status s);

    /// Enables the PWM.
    /// |idx| : Index of requested PWM.
    /// @Returns : |s| : ZX_OK if success.
    Enable(uint32 idx) -> (zx.status s);

    /// Disables the PWM.
    /// |idx| : Index of requested PWM.
    /// @Returns : |s| : ZX_OK  if success.
    Disable(uint32 idx) -> (zx.status s);
};
