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