/*
 * This file is part of the coreboot project.
 *
 * Copyright (C) 2016 Intel Corp.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied wacbmem_entryanty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#define __SIMPLE_DEVICE__

#include <arch/io.h>
#include <console/console.h>
#include <device/i2c.h>
#include <soc/pci_devs.h>
#include <soc/reg_access.h>
#include "reg_access.h"

#if ENV_RAMSTAGE
static uint64_t reg_read(struct reg_script_context *ctx)
{
	int ret_code;
	const struct reg_script *step;
	uint8_t value = 0;

	step = ctx->step;
	switch (step->id) {
	default:
		printk(BIOS_ERR,
			"ERROR - Unknown register set (0x%08x)!\n",
			step->id);
		ctx->display_features = REG_SCRIPT_DISPLAY_NOTHING;
		break;

	case GEN1_I2C_GPIO_EXP_0x20:
	case GEN1_I2C_GPIO_EXP_0x21:
	case GEN2_I2C_GPIO_EXP0:
	case GEN2_I2C_GPIO_EXP1:
	case GEN2_I2C_GPIO_EXP2:
	case GEN2_I2C_LED_PWM:
		if (ctx->display_features)
			printk(BIOS_INFO, "I2C chip 0x%02x: ", step->id);
		ret_code = i2c_readb(0, step->id, (UINT8)step->reg, &value);
		ASSERT(ret_code == 2);
		break;
	}
	return value;
}

static void reg_write(struct reg_script_context *ctx)
{
	int ret_code;
	const struct reg_script *step;
	uint8_t value;

	step = ctx->step;
	switch (step->id) {
	default:
		printk(BIOS_ERR,
			"ERROR - Unknown register set (0x%08x)!\n",
			step->id);
		ctx->display_features = REG_SCRIPT_DISPLAY_NOTHING;
		break;

	case GEN1_I2C_GPIO_EXP_0x20:
	case GEN1_I2C_GPIO_EXP_0x21:
	case GEN2_I2C_GPIO_EXP0:
	case GEN2_I2C_GPIO_EXP1:
	case GEN2_I2C_GPIO_EXP2:
	case GEN2_I2C_LED_PWM:
	case RMU_TEMP_REGS:
		if (ctx->display_features)
			printk(BIOS_INFO, "I2C chip 0x%02x: ", step->id);
		value = (UINT8)step->value;
		ret_code = i2c_writeb(0, step->id, (UINT8)step->reg, value);
		ASSERT(ret_code == 2);
		break;
	}
}

const struct reg_script_bus_entry mainboard_reg_script_bus_table = {
	MAINBOARD_TYPE, reg_read, reg_write
};

REG_SCRIPT_BUS_ENTRY(mainboard_reg_script_bus_table);

#endif	/* ENV_RAMSTAGE */
