11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Filename:      tekram.c
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Version:       1.3
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Description:   Implementation of the Tekram IrMate IR-210B dongle
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Status:        Experimental.
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Author:        Dag Brattli <dagb@cs.uit.no>
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Created at:    Wed Oct 21 20:02:35 1998
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Modified at:   Sun Oct 27 22:02:38 2002
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Modified by:   Martin Diehl <mad@mdiehl.de>
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     Copyright (c) 1998-1999 Dag Brattli,
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     Copyright (c) 2002 Martin Diehl,
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     All Rights Reserved.
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     This program is free software; you can redistribute it and/or
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     modify it under the terms of the GNU General Public License as
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     published by the Free Software Foundation; either version 2 of
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     the License, or (at your option) any later version.
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2196de0e252cedffad61b3cb5e05662c591898e69aJan Engelhardt *     Neither Dag Brattli nor University of Tromsø admit liability nor
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     provide warranty for any of this software. This material is
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     provided "AS-IS" and at no charge.
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ********************************************************************/
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h>
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/delay.h>
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/irda/irda.h>
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "sir-dev.h"
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int tekram_delay = 150;		/* default is 150 ms */
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param(tekram_delay, int, 0);
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_PARM_DESC(tekram_delay, "tekram dongle write complete delay");
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int tekram_open(struct sir_dev *);
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int tekram_close(struct sir_dev *);
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int tekram_change_speed(struct sir_dev *, unsigned);
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int tekram_reset(struct sir_dev *);
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TEKRAM_115200 0x00
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TEKRAM_57600  0x01
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TEKRAM_38400  0x02
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TEKRAM_19200  0x03
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TEKRAM_9600   0x04
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TEKRAM_PW     0x10 /* Pulse select bit */
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct dongle_driver tekram = {
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.owner		= THIS_MODULE,
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.driver_name	= "Tekram IR-210B",
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.type		= IRDA_TEKRAM_DONGLE,
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.open		= tekram_open,
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.close		= tekram_close,
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.reset		= tekram_reset,
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.set_speed	= tekram_change_speed,
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init tekram_sir_init(void)
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (tekram_delay < 1  ||  tekram_delay > 500)
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		tekram_delay = 200;
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRDA_DEBUG(1, "%s - using %d ms delay\n",
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		tekram.driver_name, tekram_delay);
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return irda_register_dongle(&tekram);
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __exit tekram_sir_cleanup(void)
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	irda_unregister_dongle(&tekram);
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int tekram_open(struct sir_dev *dev)
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct qos_info *qos = &dev->qos;
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
80a97a6f10771b90235b33c13a6db9279237a08422Harvey Harrison	IRDA_DEBUG(2, "%s()\n", __func__);
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sirdev_set_dtr_rts(dev, TRUE, TRUE);
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	qos->baud_rate.bits &= IR_9600|IR_19200|IR_38400|IR_57600|IR_115200;
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	qos->min_turn_time.bits = 0x01; /* Needs at least 10 ms */
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	irda_qos_bits_to_value(qos);
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* irda thread waits 50 msec for power settling */
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int tekram_close(struct sir_dev *dev)
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
95a97a6f10771b90235b33c13a6db9279237a08422Harvey Harrison	IRDA_DEBUG(2, "%s()\n", __func__);
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Power off dongle */
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sirdev_set_dtr_rts(dev, FALSE, FALSE);
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function tekram_change_speed (dev, state, speed)
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    Set the speed for the Tekram IRMate 210 type dongle. Warning, this
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    function must be called with a process context!
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    Algorithm
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    1. clear DTR
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    2. set RTS, and wait at least 7 us
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    3. send Control Byte to the IR-210 through TXD to set new baud rate
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *       wait until the stop bit of Control Byte is sent (for 9600 baud rate,
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *       it takes about 100 msec)
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	[oops, why 100 msec? sending 1 byte (10 bits) takes 1.05 msec
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	 - is this probably to compensate for delays in tty layer?]
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    5. clear RTS (return to NORMAL Operation)
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    6. wait at least 50 us, new setting (baud rate, etc) takes effect here
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *       after
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TEKRAM_STATE_WAIT_SPEED	(SIRDEV_STATE_DONGLE_SPEED + 1)
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int tekram_change_speed(struct sir_dev *dev, unsigned speed)
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned state = dev->fsm.substate;
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned delay = 0;
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8 byte;
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	static int ret = 0;
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
133a97a6f10771b90235b33c13a6db9279237a08422Harvey Harrison	IRDA_DEBUG(2, "%s()\n", __func__);
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch(state) {
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SIRDEV_STATE_DONGLE_SPEED:
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (speed) {
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			speed = 9600;
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ret = -EINVAL;
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* fall thru */
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 9600:
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			byte = TEKRAM_PW|TEKRAM_9600;
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 19200:
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			byte = TEKRAM_PW|TEKRAM_19200;
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 38400:
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			byte = TEKRAM_PW|TEKRAM_38400;
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 57600:
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			byte = TEKRAM_PW|TEKRAM_57600;
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 115200:
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			byte = TEKRAM_115200;
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Set DTR, Clear RTS */
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		sirdev_set_dtr_rts(dev, TRUE, FALSE);
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Wait at least 7us */
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		udelay(14);
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Write control byte */
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		sirdev_raw_write(dev, &byte, 1);
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dev->speed = speed;
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		state = TEKRAM_STATE_WAIT_SPEED;
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		delay = tekram_delay;
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case TEKRAM_STATE_WAIT_SPEED:
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Set DTR, Set RTS */
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		sirdev_set_dtr_rts(dev, TRUE, TRUE);
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		udelay(50);
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
182a97a6f10771b90235b33c13a6db9279237a08422Harvey Harrison		IRDA_ERROR("%s - undefined state %d\n", __func__, state);
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = -EINVAL;
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dev->fsm.substate = state;
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return (delay > 0) ? delay : ret;
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function tekram_reset (driver)
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *      This function resets the tekram dongle. Warning, this function
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *      must be called with a process context!!
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *      Algorithm:
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    	  0. Clear RTS and DTR, and wait 50 ms (power off the IR-210 )
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        1. clear RTS
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        2. set DTR, and wait at least 1 ms
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        3. clear DTR to SPACE state, wait at least 50 us for further
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *         operation
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int tekram_reset(struct sir_dev *dev)
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
207a97a6f10771b90235b33c13a6db9279237a08422Harvey Harrison	IRDA_DEBUG(2, "%s()\n", __func__);
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Clear DTR, Set RTS */
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sirdev_set_dtr_rts(dev, FALSE, TRUE);
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Should sleep 1 ms */
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	msleep(1);
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Set DTR, Set RTS */
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sirdev_set_dtr_rts(dev, TRUE, TRUE);
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Wait at least 50 us */
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	udelay(75);
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dev->speed = 9600;
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_AUTHOR("Dag Brattli <dagb@cs.uit.no>");
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DESCRIPTION("Tekram IrMate IR-210B dongle driver");
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL");
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_ALIAS("irda-dongle-0"); /* IRDA_TEKRAM_DONGLE */
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(tekram_sir_init);
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_exit(tekram_sir_cleanup);
233