/**
 * Copyright (c) 2012-2013 Quantenna Communications, Inc.
 * All rights reserved.
 *
 * 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.
 *
 * 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.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 **/

#include <linux/version.h>
#include <linux/module.h>

#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/io.h>

#include <asm/hardware.h>

#include <asm/board/platform.h>

#define TOPAZ_TQE_PROC_FILENAME	"topaz_tqe"

#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
static int topaz_tqe_stat_rd(struct seq_file *sfile, void *data)
{
	int i;
	struct {
		uint32_t reg;
		const char *name;
	} regs[] = {
		{ TOPAZ_TQE_OUTPORT_EMAC0_CNT, "emac0", },
		{ TOPAZ_TQE_OUTPORT_EMAC1_CNT, "emac1", },
		{ TOPAZ_TQE_OUTPORT_WMAC_CNT, "wmac", },
		{ TOPAZ_TQE_OUTPORT_LHOST_CNT, "lhost", },
		{ TOPAZ_TQE_OUTPORT_MUC_CNT, "muc", },
		{ TOPAZ_TQE_OUTPORT_DSP_CNT, "dsp", },
		{ TOPAZ_TQE_OUTPORT_AUC_CNT, "auc", },
		{ TOPAZ_TQE_OUTPORT_PCIE_CNT, "pcie", },
		{ TOPAZ_TQE_DROP_CNT, "drop", },
		{ TOPAZ_TQE_DROP_EMAC0_CNT, "emac0 d", },
		{ TOPAZ_TQE_DROP_EMAC1_CNT, "emac1 d", },
		{ TOPAZ_TQE_DROP_WMAC_CNT, "wmac d", },
		{ TOPAZ_TQE_DROP_LHOST_CNT, "lhost d", },
		{ TOPAZ_TQE_DROP_MUC_CNT, "muc d", },
		{ TOPAZ_TQE_DROP_DSP_CNT, "dsp d", },
		{ TOPAZ_TQE_DROP_AUC_CNT, "auc d", },
		{ TOPAZ_TQE_DROP_PCIE_CNT, "pcie d", },
	};

	for (i = 0; i < ARRAY_SIZE(regs); i++) {
		uint32_t reg = readl(regs[i].reg);
		seq_printf(sfile, "%8s = %u 0x%08x\n", regs[i].name, reg, reg);
	}

	return 0;
}

static int topaz_tqe_stat_open(struct inode *inode, struct file *file)
{
	return single_open(file, topaz_tqe_stat_rd, NULL);
}

static const struct file_operations topaz_tqe_stat_fops = {
	.owner		= THIS_MODULE,
	.open		= topaz_tqe_stat_open,
	.read		= seq_read,
	.llseek		= seq_lseek,
	.release	= single_release,
};

#else
static int topaz_tqe_stat_rd(char *page, char **start, off_t offset,
		int count, int *eof, void *data)
{
	char *p = page;
	int i;
	struct {
		uint32_t reg;
		const char *name;
	} regs[] = {
		{ TOPAZ_TQE_OUTPORT_EMAC0_CNT, "emac0", },
		{ TOPAZ_TQE_OUTPORT_EMAC1_CNT, "emac1", },
		{ TOPAZ_TQE_OUTPORT_WMAC_CNT, "wmac", },
		{ TOPAZ_TQE_OUTPORT_LHOST_CNT, "lhost", },
		{ TOPAZ_TQE_OUTPORT_MUC_CNT, "muc", },
		{ TOPAZ_TQE_OUTPORT_DSP_CNT, "dsp", },
		{ TOPAZ_TQE_OUTPORT_AUC_CNT, "auc", },
		{ TOPAZ_TQE_OUTPORT_PCIE_CNT, "pcie", },
		{ TOPAZ_TQE_DROP_CNT, "drop", },
		{ TOPAZ_TQE_DROP_EMAC0_CNT, "emac0 d", },
		{ TOPAZ_TQE_DROP_EMAC1_CNT, "emac1 d", },
		{ TOPAZ_TQE_DROP_WMAC_CNT, "wmac d", },
		{ TOPAZ_TQE_DROP_LHOST_CNT, "lhost d", },
		{ TOPAZ_TQE_DROP_MUC_CNT, "muc d", },
		{ TOPAZ_TQE_DROP_DSP_CNT, "dsp d", },
		{ TOPAZ_TQE_DROP_AUC_CNT, "auc d", },
		{ TOPAZ_TQE_DROP_PCIE_CNT, "pcie d", },
	};

	for (i = 0; i < ARRAY_SIZE(regs); i++) {
		uint32_t reg = readl(regs[i].reg);
		p += sprintf(p, "%8s = %u 0x%08x\n", regs[i].name, reg, reg);
	}

	return p - page;
}
#endif

static int __init topaz_tqe_stat_init(void)
{
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
	if (!proc_create(TOPAZ_TQE_PROC_FILENAME, 0x444, NULL, &topaz_tqe_stat_fops))
		return -EEXIST;

#else
	if (!create_proc_read_entry(TOPAZ_TQE_PROC_FILENAME, 0,
				NULL, topaz_tqe_stat_rd, NULL)) {
		return -EEXIST;
	}
#endif
	return 0;
}

late_initcall(topaz_tqe_stat_init);

MODULE_DESCRIPTION("TQE");
MODULE_AUTHOR("Quantenna");
MODULE_LICENSE("GPL");
