/*
 * Siemens USB-MPI Serial USB driver
 *
 * Copyright (C) 2005 Thomas Hergenhahn <thomas.hergenhahn@suse.de>
 * Copyright (C) 2005,2008 Greg Kroah-Hartman <gregkh@suse.de>
 *
 *	This program is free software; you can redistribute it and/or
 *	modify it under the terms of the GNU General Public License version
 *	2 as published by the Free Software Foundation.
 */

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/tty.h>
#include <linux/module.h>
#include <linux/usb.h>
#include <linux/usb/serial.h>

/* Version Information */
#define DRIVER_VERSION "Version 0.1 09/26/2005"
#define DRIVER_AUTHOR "Thomas Hergenhahn@web.de http://libnodave.sf.net"
#define DRIVER_DESC "Driver for Siemens USB/MPI adapter"


static const struct usb_device_id id_table[] = {
	/* Vendor and product id for 6ES7-972-0CB20-0XA0 */
	{ USB_DEVICE(0x908, 0x0004) },
	{ },
};
MODULE_DEVICE_TABLE(usb, id_table);

static struct usb_driver siemens_usb_mpi_driver = {
	.name =		"siemens_mpi",
	.probe =	usb_serial_probe,
	.disconnect =	usb_serial_disconnect,
	.id_table =	id_table,
};

static struct usb_serial_driver siemens_usb_mpi_device = {
	.driver = {
		.owner =	THIS_MODULE,
		.name =		"siemens_mpi",
	},
	.id_table =		id_table,
	.usb_driver =		&siemens_usb_mpi_driver,
	.num_ports =		1,
};

static int __init siemens_usb_mpi_init(void)
{
	int retval;

	retval = usb_serial_register(&siemens_usb_mpi_device);
	if (retval)
		goto failed_usb_serial_register;
	retval = usb_register(&siemens_usb_mpi_driver);
	if (retval)
		goto failed_usb_register;
	printk(KERN_INFO DRIVER_DESC "\n");
	printk(KERN_INFO DRIVER_VERSION " " DRIVER_AUTHOR "\n");
	return retval;
failed_usb_register:
	usb_serial_deregister(&siemens_usb_mpi_device);
failed_usb_serial_register:
	return retval;
}

static void __exit siemens_usb_mpi_exit(void)
{
	usb_deregister(&siemens_usb_mpi_driver);
	usb_serial_deregister(&siemens_usb_mpi_device);
}

module_init(siemens_usb_mpi_init);
module_exit(siemens_usb_mpi_exit);
MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_LICENSE("GPL");
