/*
 * read/write operation to the PCI config space of CS5536
 *
 * Copyright (C) 2007 Lemote, Inc.
 * Author : jlliu, liujl@lemote.com
 *
 * Copyright (C) 2009 Lemote, Inc.
 * Author: Wu Zhangjin, wuzhangjin@gmail.com
 *
 * 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;  either version 2 of the  License, or (at your
 * option) any later version.
 *
 *	the Virtual Support Module(VSM) for virtulizing the PCI
 *	configure space are defined in cs5536_modulename.c respectively,
 *
 *	after this virtulizing, user can access the PCI configure space
 *	directly as a normal multi-function PCI device which follows
 *	the PCI-2.2 spec.
 */

#include <linux/types.h>
#include <cs5536/cs5536_vsm.h>

enum {
	CS5536_FUNC_START = -1,
	CS5536_ISA_FUNC,
	reserved_func,
	CS5536_IDE_FUNC,
	CS5536_ACC_FUNC,
	CS5536_OHCI_FUNC,
	CS5536_EHCI_FUNC,
	CS5536_FUNC_END,
};

static const cs5536_pci_vsm_write vsm_conf_write[] = {
	[CS5536_ISA_FUNC]	pci_isa_write_reg,
	[reserved_func]		NULL,
	[CS5536_IDE_FUNC]	pci_ide_write_reg,
	[CS5536_ACC_FUNC]	pci_acc_write_reg,
	[CS5536_OHCI_FUNC]	pci_ohci_write_reg,
	[CS5536_EHCI_FUNC]	pci_ehci_write_reg,
};

static const cs5536_pci_vsm_read vsm_conf_read[] = {
	[CS5536_ISA_FUNC]	pci_isa_read_reg,
	[reserved_func]		NULL,
	[CS5536_IDE_FUNC]	pci_ide_read_reg,
	[CS5536_ACC_FUNC]	pci_acc_read_reg,
	[CS5536_OHCI_FUNC]	pci_ohci_read_reg,
	[CS5536_EHCI_FUNC]	pci_ehci_read_reg,
};

/*
 * write to PCI config space and transfer it to MSR write.
 */
void cs5536_pci_conf_write4(int function, int reg, u32 value)
{
	if ((function <= CS5536_FUNC_START) || (function >= CS5536_FUNC_END))
		return;
	if ((reg < 0) || (reg > 0x100) || ((reg & 0x03) != 0))
		return;

	if (vsm_conf_write[function] != NULL)
		vsm_conf_write[function](reg, value);
}

/*
 * read PCI config space and transfer it to MSR access.
 */
u32 cs5536_pci_conf_read4(int function, int reg)
{
	u32 data = 0;

	if ((function <= CS5536_FUNC_START) || (function >= CS5536_FUNC_END))
		return 0;
	if ((reg < 0) || ((reg & 0x03) != 0))
		return 0;
	if (reg > 0x100)
		return 0xffffffff;

	if (vsm_conf_read[function] != NULL)
		data = vsm_conf_read[function](reg);

	return data;
}
