/*
 * Copyright (c) 2019, Intel Corporation. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include <common/debug.h>
#include <lib/mmio.h>

#include "watchdog.h"


/* Reset watchdog timer */
void watchdog_sw_rst(void)
{
	mmio_write_32(WDT_CRR, WDT_SW_RST);
}

/* Print component information */
void watchdog_info(void)
{
	INFO("Component Type    : %x\r\n", mmio_read_32(WDT_COMP_VERSION));
	INFO("Component Version : %x\r\n", mmio_read_32(WDT_COMP_TYPE));
}

/* Check watchdog current status */
void watchdog_status(void)
{
	if (mmio_read_32(WDT_CR) & 1) {
		INFO("Watchdog Timer is currently enabled\n");
		INFO("Current Counter : 0x%x\r\n", mmio_read_32(WDT_CCVR));
	} else {
		INFO("Watchdog Timer is currently disabled\n");
	}
}

/* Initialize & enable watchdog */
void watchdog_init(int watchdog_clk)
{
	uint8_t cycles_i = 0;
	uint32_t wdt_cycles = WDT_MIN_CYCLES;
	uint32_t top_init_cycles = WDT_PERIOD * watchdog_clk;

	while ((cycles_i < 15) && (wdt_cycles < top_init_cycles)) {
		wdt_cycles = (wdt_cycles << 1);
		cycles_i++;
	}

	mmio_write_32(WDT_TORR, (cycles_i << 4) | cycles_i);

	mmio_write_32(WDT_CR, WDT_CR_RMOD|WDT_CR_EN);
}
