/*********************************************************************
 *                
 * Filename:      litelink.c
 * Version:       1.1
 * Description:   Driver for the Parallax LiteLink dongle
 * Status:        Stable
 * Author:        Dag Brattli <dagb@cs.uit.no>
 * Created at:    Fri May  7 12:50:33 1999
 * Modified at:   Fri Dec 17 09:14:23 1999
 * Modified by:   Dag Brattli <dagb@cs.uit.no>
 * 
 *     Copyright (c) 1999 Dag Brattli, 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., 59 Temple Place, Suite 330, Boston, 
 *     MA 02111-1307 USA
 *     
 ********************************************************************/

/*
 * Modified at:   Thu Jan 15 2003
 * Modified by:   Eugene Crosser <crosser@average.org>
 *
 * Convert to "new" IRDA infrastructure for kernel 2.6
 */

#include <linux/module.h>
#include <linux/delay.h>
#include <linux/init.h>

#include <net/irda/irda.h>

#include "sir-dev.h"

#define MIN_DELAY 25      /* 15 us, but wait a little more to be sure */
#define MAX_DELAY 10000   /* 1 ms */

static int litelink_open(struct sir_dev *dev);
static int litelink_close(struct sir_dev *dev);
static int litelink_change_speed(struct sir_dev *dev, unsigned speed);
static int litelink_reset(struct sir_dev *dev);

/* These are the baudrates supported - 9600 must be last one! */
static unsigned baud_rates[] = { 115200, 57600, 38400, 19200, 9600 };

static struct dongle_driver litelink = {
	.owner		= THIS_MODULE,
	.driver_name	= "Parallax LiteLink",
	.type		= IRDA_LITELINK_DONGLE,
	.open		= litelink_open,
	.close		= litelink_close,
	.reset		= litelink_reset,
	.set_speed	= litelink_change_speed,
};

static int __init litelink_sir_init(void)
{
	return irda_register_dongle(&litelink);
}

static void __exit litelink_sir_cleanup(void)
{
	irda_unregister_dongle(&litelink);
}

static int litelink_open(struct sir_dev *dev)
{
	struct qos_info *qos = &dev->qos;

	IRDA_DEBUG(2, "%s()\n", __func__);

	/* Power up dongle */
	sirdev_set_dtr_rts(dev, TRUE, TRUE);

	/* Set the speeds we can accept */
	qos->baud_rate.bits &= IR_115200|IR_57600|IR_38400|IR_19200|IR_9600;
	qos->min_turn_time.bits = 0x7f; /* Needs 0.01 ms */
	irda_qos_bits_to_value(qos);

	/* irda thread waits 50 msec for power settling */

	return 0;
}

static int litelink_close(struct sir_dev *dev)
{
	IRDA_DEBUG(2, "%s()\n", __func__);

	/* Power off dongle */
	sirdev_set_dtr_rts(dev, FALSE, FALSE);

	return 0;
}

/*
 * Function litelink_change_speed (task)
 *
 *    Change speed of the Litelink dongle. To cycle through the available 
 *    baud rates, pulse RTS low for a few ms.  
 */
static int litelink_change_speed(struct sir_dev *dev, unsigned speed)
{
        int i;

	IRDA_DEBUG(2, "%s()\n", __func__);

	/* dongle already reset by irda-thread - current speed (dongle and
	 * port) is the default speed (115200 for litelink!)
	 */

	/* Cycle through avaiable baudrates until we reach the correct one */
	for (i = 0; baud_rates[i] != speed; i++) {

		/* end-of-list reached due to invalid speed request */
		if (baud_rates[i] == 9600)
			break;

		/* Set DTR, clear RTS */
		sirdev_set_dtr_rts(dev, FALSE, TRUE);

		/* Sleep a minimum of 15 us */
		udelay(MIN_DELAY);

		/* Set DTR, Set RTS */
		sirdev_set_dtr_rts(dev, TRUE, TRUE);

		/* Sleep a minimum of 15 us */
		udelay(MIN_DELAY);
        }

	dev->speed = baud_rates[i];

	/* invalid baudrate should not happen - but if, we return -EINVAL and
	 * the dongle configured for 9600 so the stack has a chance to recover
	 */

	return (dev->speed == speed) ? 0 : -EINVAL;
}

/*
 * Function litelink_reset (task)
 *
 *      Reset the Litelink type dongle.
 *
 */
static int litelink_reset(struct sir_dev *dev)
{
	IRDA_DEBUG(2, "%s()\n", __func__);

	/* probably the power-up can be dropped here, but with only
	 * 15 usec delay it's not worth the risk unless somebody with
	 * the hardware confirms it doesn't break anything...
	 */

	/* Power on dongle */
	sirdev_set_dtr_rts(dev, TRUE, TRUE);

	/* Sleep a minimum of 15 us */
	udelay(MIN_DELAY);

	/* Clear RTS to reset dongle */
	sirdev_set_dtr_rts(dev, TRUE, FALSE);

	/* Sleep a minimum of 15 us */
	udelay(MIN_DELAY);

	/* Go back to normal mode */
	sirdev_set_dtr_rts(dev, TRUE, TRUE);

	/* Sleep a minimum of 15 us */
	udelay(MIN_DELAY);

	/* This dongles speed defaults to 115200 bps */
	dev->speed = 115200;

	return 0;
}

MODULE_AUTHOR("Dag Brattli <dagb@cs.uit.no>");
MODULE_DESCRIPTION("Parallax Litelink dongle driver");	
MODULE_LICENSE("GPL");
MODULE_ALIAS("irda-dongle-5"); /* IRDA_LITELINK_DONGLE */

/*
 * Function init_module (void)
 *
 *    Initialize Litelink module
 *
 */
module_init(litelink_sir_init);

/*
 * Function cleanup_module (void)
 *
 *    Cleanup Litelink module
 *
 */
module_exit(litelink_sir_cleanup);
