11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Filename:      ma600.c
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Version:       0.1
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Description:   Implementation of the MA600 dongle
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Status:        Experimental.
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Author:        Leung <95Etwl@alumni.ee.ust.hk> http://www.engsvr.ust/~eetwl95
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Created at:    Sat Jun 10 20:02:35 2000
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Modified at:   Sat Aug 16 09:34:13 2003
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Modified by:   Martin Diehl <mad@mdiehl.de> (modified for new sir_dev)
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Note: very thanks to Mr. Maru Wang <maru@mobileaction.com.tw> for providing
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *       information on the MA600 dongle
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     Copyright (c) 2000 Leung, All Rights Reserved.
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     This program is free software; you can redistribute it and/or
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     modify it under the terms of the GNU General Public License as
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     published by the Free Software Foundation; either version 2 of
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     the License, or (at your option) any later version.
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     This program is distributed in the hope that it will be useful,
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     but WITHOUT ANY WARRANTY; without even the implied warranty of
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     GNU General Public License for more details.
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     You should have received a copy of the GNU General Public License
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     along with this program; if not, write to the Free Software
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     Foundation, Inc., 59 Temple Place, Suite 330, Boston,
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     MA 02111-1307 USA
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ********************************************************************/
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h>
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/delay.h>
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/irda/irda.h>
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "sir-dev.h"
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ma600_open(struct sir_dev *);
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ma600_close(struct sir_dev *);
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ma600_change_speed(struct sir_dev *, unsigned);
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ma600_reset(struct sir_dev *);
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* control byte for MA600 */
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MA600_9600	0x00
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MA600_19200	0x01
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MA600_38400	0x02
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MA600_57600	0x03
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MA600_115200	0x04
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MA600_DEV_ID1	0x05
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MA600_DEV_ID2	0x06
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MA600_2400	0x08
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct dongle_driver ma600 = {
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.owner          = THIS_MODULE,
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.driver_name    = "MA600",
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.type           = IRDA_MA600_DONGLE,
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.open           = ma600_open,
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.close          = ma600_close,
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.reset          = ma600_reset,
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.set_speed      = ma600_change_speed,
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init ma600_sir_init(void)
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
70a97a6f10771b90235b33c13a6db9279237a08422Harvey Harrison	IRDA_DEBUG(2, "%s()\n", __func__);
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return irda_register_dongle(&ma600);
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __exit ma600_sir_cleanup(void)
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
76a97a6f10771b90235b33c13a6db9279237a08422Harvey Harrison	IRDA_DEBUG(2, "%s()\n", __func__);
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	irda_unregister_dongle(&ma600);
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Power on:
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		(0) Clear RTS and DTR for 1 second
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		(1) Set RTS and DTR for 1 second
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		(2) 9600 bps now
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Note: assume RTS, DTR are clear before
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*/
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ma600_open(struct sir_dev *dev)
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct qos_info *qos = &dev->qos;
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
91a97a6f10771b90235b33c13a6db9279237a08422Harvey Harrison	IRDA_DEBUG(2, "%s()\n", __func__);
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sirdev_set_dtr_rts(dev, TRUE, TRUE);
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Explicitly set the speeds we can accept */
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	qos->baud_rate.bits &= IR_2400|IR_9600|IR_19200|IR_38400
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				|IR_57600|IR_115200;
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Hm, 0x01 means 10ms - for >= 1ms we would need 0x07 */
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	qos->min_turn_time.bits = 0x01;		/* Needs at least 1 ms */
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	irda_qos_bits_to_value(qos);
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* irda thread waits 50 msec for power settling */
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ma600_close(struct sir_dev *dev)
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
109a97a6f10771b90235b33c13a6db9279237a08422Harvey Harrison	IRDA_DEBUG(2, "%s()\n", __func__);
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Power off dongle */
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sirdev_set_dtr_rts(dev, FALSE, FALSE);
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic __u8 get_control_byte(__u32 speed)
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8 byte;
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (speed) {
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 115200:
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		byte = MA600_115200;
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 57600:
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		byte = MA600_57600;
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 38400:
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		byte = MA600_38400;
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 19200:
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		byte = MA600_19200;
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 9600:
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		byte = MA600_9600;
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 2400:
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		byte = MA600_2400;
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return byte;
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function ma600_change_speed (dev, speed)
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    Set the speed for the MA600 type dongle.
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    The dongle has already been reset to a known state (dongle default)
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    We cycle through speeds by pulsing RTS low and then high.
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function ma600_change_speed (dev, speed)
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    Set the speed for the MA600 type dongle.
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    Algorithm
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    1. Reset (already done by irda thread state machine)
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    2. clear RTS, set DTR and wait for 1ms
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    3. send Control Byte to the MA600 through TXD to set new baud rate
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *       wait until the stop bit of Control Byte is sent (for 9600 baud rate,
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *       it takes about 10 msec)
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    4. set RTS, set DTR (return to NORMAL Operation)
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    5. wait at least 10 ms, new setting (baud rate, etc) takes effect here
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *       after
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* total delays are only about 20ms - let's just sleep for now to
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * avoid the state machine complexity before we get things working
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ma600_change_speed(struct sir_dev *dev, unsigned speed)
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8	byte;
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
179a97a6f10771b90235b33c13a6db9279237a08422Harvey Harrison	IRDA_DEBUG(2, "%s(), speed=%d (was %d)\n", __func__,
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		speed, dev->speed);
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* dongle already reset, dongle and port at default speed (9600) */
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Set RTS low for 1 ms */
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sirdev_set_dtr_rts(dev, TRUE, FALSE);
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mdelay(1);
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Write control byte */
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	byte = get_control_byte(speed);
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sirdev_raw_write(dev, &byte, sizeof(byte));
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Wait at least 10ms: fake wait_until_sent - 10 bits at 9600 baud*/
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	msleep(15);					/* old ma600 uses 15ms */
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if 1
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* read-back of the control byte. ma600 is the first dongle driver
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * which uses this so there might be some unidentified issues.
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Disable this in case of problems with readback.
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sirdev_raw_read(dev, &byte, sizeof(byte));
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (byte != get_control_byte(speed))  {
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		IRDA_WARNING("%s(): bad control byte read-back %02x != %02x\n",
204a97a6f10771b90235b33c13a6db9279237a08422Harvey Harrison			     __func__, (unsigned) byte,
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			     (unsigned) get_control_byte(speed));
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else
209a97a6f10771b90235b33c13a6db9279237a08422Harvey Harrison		IRDA_DEBUG(2, "%s() control byte write read OK\n", __func__);
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Set DTR, Set RTS */
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sirdev_set_dtr_rts(dev, TRUE, TRUE);
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Wait at least 10ms */
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	msleep(10);
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* dongle is now switched to the new speed */
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dev->speed = speed;
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function ma600_reset (dev)
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *      This function resets the ma600 dongle.
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *      Algorithm:
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    	  0. DTR=0, RTS=1 and wait 10 ms
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    	  1. DTR=1, RTS=1 and wait 10 ms
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        2. 9600 bps now
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* total delays are only about 20ms - let's just sleep for now to
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * avoid the state machine complexity before we get things working
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2390e49e64526ccd8cb78d7c4b4a732024ff221d4d0Hannes Ederstatic int ma600_reset(struct sir_dev *dev)
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
241a97a6f10771b90235b33c13a6db9279237a08422Harvey Harrison	IRDA_DEBUG(2, "%s()\n", __func__);
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Reset the dongle : set DTR low for 10 ms */
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sirdev_set_dtr_rts(dev, FALSE, TRUE);
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	msleep(10);
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Go back to normal mode */
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sirdev_set_dtr_rts(dev, TRUE, TRUE);
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	msleep(10);
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dev->speed = 9600;      /* That's the dongle-default */
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_AUTHOR("Leung <95Etwl@alumni.ee.ust.hk> http://www.engsvr.ust/~eetwl95");
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DESCRIPTION("MA600 dongle driver version 0.1");
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL");
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_ALIAS("irda-dongle-11"); /* IRDA_MA600_DONGLE */
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(ma600_sir_init);
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_exit(ma600_sir_cleanup);
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
264