/*
 *	Sky Nexus Register Driver
 *
 *	Copyright (C) 2002 Brian Waite
 *
 *	This driver allows reading the Nexus register
 *	It exports the /proc/sky_chassis_id and also
 *	/proc/sky_slot_id pseudo-file for status information.
 *
 *	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.
 *
 */

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/hdpu_features.h>
#include <linux/platform_device.h>
#include <linux/seq_file.h>
#include <asm/io.h>

static int hdpu_nexus_probe(struct platform_device *pdev);
static int hdpu_nexus_remove(struct platform_device *pdev);
static int hdpu_slot_id_open(struct inode *inode, struct file *file);
static int hdpu_slot_id_read(struct seq_file *seq, void *offset);
static int hdpu_chassis_id_open(struct inode *inode, struct file *file);
static int hdpu_chassis_id_read(struct seq_file *seq, void *offset);

static struct proc_dir_entry *hdpu_slot_id;
static struct proc_dir_entry *hdpu_chassis_id;
static int slot_id = -1;
static int chassis_id = -1;

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

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

static struct platform_driver hdpu_nexus_driver = {
	.probe = hdpu_nexus_probe,
	.remove = hdpu_nexus_remove,
	.driver = {
		.name = HDPU_NEXUS_NAME,
	},
};

static int hdpu_slot_id_open(struct inode *inode, struct file *file)
{
	return single_open(file, hdpu_slot_id_read, NULL);
}

static int hdpu_slot_id_read(struct seq_file *seq, void *offset)
{
	seq_printf(seq, "%d\n", slot_id);
	return 0;
}

static int hdpu_chassis_id_open(struct inode *inode, struct file *file)
{
	return single_open(file, hdpu_chassis_id_read, NULL);
}

static int hdpu_chassis_id_read(struct seq_file *seq, void *offset)
{
	seq_printf(seq, "%d\n", chassis_id);
	return 0;
}

static int hdpu_nexus_probe(struct platform_device *pdev)
{
	struct resource *res;
	int *nexus_id_addr;

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!res) {
		printk(KERN_ERR "sky_nexus: "
		       "Invalid memory resource.\n");
		return -EINVAL;
	}
	nexus_id_addr = ioremap(res->start,
				(unsigned long)(res->end - res->start));
	if (nexus_id_addr) {
		slot_id = (*nexus_id_addr >> 8) & 0x1f;
		chassis_id = *nexus_id_addr & 0xff;
		iounmap(nexus_id_addr);
	} else {
		printk(KERN_ERR "sky_nexus: Could not map slot id\n");
	}

	hdpu_slot_id = create_proc_entry("sky_slot_id", 0666, &proc_root);
	if (!hdpu_slot_id) {
		printk(KERN_WARNING "sky_nexus: "
		       "Unable to create proc dir entry: sky_slot_id\n");
	} else {
		hdpu_slot_id->proc_fops = &proc_slot_id;
		hdpu_slot_id->owner = THIS_MODULE;
	}

	hdpu_chassis_id = create_proc_entry("sky_chassis_id", 0666, &proc_root);
	if (!hdpu_chassis_id) {
		printk(KERN_WARNING "sky_nexus: "
		       "Unable to create proc dir entry: sky_chassis_id\n");
	} else {
		hdpu_chassis_id->proc_fops = &proc_chassis_id;
		hdpu_chassis_id->owner = THIS_MODULE;
	}

	return 0;
}

static int hdpu_nexus_remove(struct platform_device *pdev)
{
	slot_id = -1;
	chassis_id = -1;

	remove_proc_entry("sky_slot_id", &proc_root);
	remove_proc_entry("sky_chassis_id", &proc_root);

	hdpu_slot_id = 0;
	hdpu_chassis_id = 0;

	return 0;
}

static int __init nexus_init(void)
{
	return platform_driver_register(&hdpu_nexus_driver);
}

static void __exit nexus_exit(void)
{
	platform_driver_unregister(&hdpu_nexus_driver);
}

module_init(nexus_init);
module_exit(nexus_exit);

MODULE_AUTHOR("Brian Waite");
MODULE_LICENSE("GPL");
