// Copyright 2018 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.

#include <zircon/types.h>

#include <array>
#include <iterator>

#include "aml-fclk.h"

#define FCLK_PLL_RATE(_r, _premux, _postmux, _mux_div) \
  { .rate = (_r), .premux = (_premux), .postmux = (_postmux), .mux_div = (_mux_div), }

/*Fix pll rate table*/
static const aml_fclk_rate_table_t fclk_pll_rate_table[] = {
    FCLK_PLL_RATE(100000000, 1, 1, 9),  FCLK_PLL_RATE(250000000, 1, 1, 3),
    FCLK_PLL_RATE(500000000, 1, 1, 1),  FCLK_PLL_RATE(667000000, 2, 0, 0),
    FCLK_PLL_RATE(1000000000, 1, 0, 0),
};

const aml_fclk_rate_table_t* s905d2_fclk_get_rate_table() { return fclk_pll_rate_table; }

size_t s905d2_fclk_get_rate_table_count() { return std::size(fclk_pll_rate_table); }

// Fixed PLL: DCO = 1536M, FCLK_DIV2 = 768M, FCLK_DIV3 = 512M
static const aml_fclk_rate_table_t a1_fclk_pll_rate_table[] = {
    FCLK_PLL_RATE(128'000'000, 2, 1, 3),  // FCLK_DIV3 source
    FCLK_PLL_RATE(256'000'000, 2, 1, 1),  // FCLK_DIV3 source
    FCLK_PLL_RATE(512'000'000, 2, 0, 0),  // FCLK_DIV3 source
    FCLK_PLL_RATE(768'000'000, 1, 0, 0),  // FCLK_DIV2 source
};

const aml_fclk_rate_table_t* a1_fclk_get_rate_table() { return a1_fclk_pll_rate_table; }

size_t a1_fclk_get_rate_table_count() { return std::size(a1_fclk_pll_rate_table); }
