/*
 * 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 warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#define __SIMPLE_DEVICE__

#include <assert.h>
#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"

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_t)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_t)step->value;
		ret_code = i2c_writeb(0, step->id, (uint8_t)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);
