/*
 *	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>

static int hdpu_nexus_probe(struct platform_device *pdev);
static int hdpu_nexus_remove(struct platform_device *pdev);

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 struct platform_driver hdpu_nexus_driver = {
	.probe = hdpu_nexus_probe,
	.remove = hdpu_nexus_remove,
	.driver = {
		.name = HDPU_NEXUS_NAME,
	},
};

int hdpu_slot_id_read(char *buffer, char **buffer_location, off_t offset,
		      int buffer_length, int *zero, void *ptr)
{

	if (offset > 0)
		return 0;
	return sprintf(buffer, "%d\n", slot_id);
}

int hdpu_chassis_id_read(char *buffer, char **buffer_location, off_t offset,
			 int buffer_length, int *zero, void *ptr)
{

	if (offset > 0)
		return 0;
	return sprintf(buffer, "%d\n", chassis_id);
}

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

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	int *nexus_id_addr;
	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("Could not map slot id\n");
	hdpu_slot_id = create_proc_entry("sky_slot_id", 0666, &proc_root);
	hdpu_slot_id->read_proc = hdpu_slot_id_read;

	hdpu_chassis_id = create_proc_entry("sky_chassis_id", 0666, &proc_root);
	hdpu_chassis_id->read_proc = hdpu_chassis_id_read;
	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)
{
	int rc;
	rc = platform_driver_register(&hdpu_nexus_driver);
	return rc;
}

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");
