// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0

#include "sw/device/lib/pinmux.h"

#include "sw/device/lib/common.h"
#include "hw/top_earlgrey/sw/autogen/top_earlgrey.h"

#include "pinmux_regs.h"  // Generated.

#define PINMUX0_BASE_ADDR TOP_EARLGREY_PINMUX_BASE_ADDR

static void init_pinmux_reg(uint32_t reg, uint32_t size, uint32_t num_fields,
                            uint32_t mask, uint32_t start_v) {
  uint32_t reg_value = 0;
  uint32_t reg_offset = 0;

  for (uint32_t i = 0; i < NUM_MIO; ++i) {
    reg_value |= ((i + start_v) & mask) << (size * (i % num_fields));
    if ((i % num_fields) == (num_fields - 1)) {
      REG32(reg + reg_offset) = reg_value;
      reg_value = 0;
      reg_offset += 4;
    }
  }

  REG32(reg + reg_offset) = reg_value;
}

void pinmux_init(void) {
  // input: assign MIO0..MIO31 to GPIO0..GPIO31
  init_pinmux_reg(PINMUX_PERIPH_INSEL_0(0), PINMUX_PERIPH_INSEL_0_IN_1_OFFSET,
                  32 / PINMUX_PERIPH_INSEL_0_IN_1_OFFSET,
                  PINMUX_PERIPH_INSEL_0_IN_0_MASK,
                  PINMUX_PERIPH_INSEL_IDX_OFFSET);

  // output: assign GPIO0..GPIO31 to MIO0..MIO31
  init_pinmux_reg(PINMUX_MIO_OUTSEL_0(0), PINMUX_MIO_OUTSEL_0_OUT_1_OFFSET,
                  32 / PINMUX_MIO_OUTSEL_0_OUT_1_OFFSET,
                  PINMUX_MIO_OUTSEL_0_OUT_0_MASK,
                  PINMUX_PERIPH_OUTSEL_IDX_OFFSET);
}
