11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/********************************************************************* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Filename: mcp2120.c 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Version: 1.0 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Description: Implementation for the MCP2120 (Microchip) 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Status: Experimental. 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Author: Felix Tang (tangf@eyetap.org) 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Created at: Sun Mar 31 19:32:12 EST 2002 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Based on code by: Dag Brattli <dagb@cs.uit.no> 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (c) 2002 Felix Tang, All Rights Reserved. 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * modify it under the terms of the GNU General Public License as 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * published by the Free Software Foundation; either version 2 of 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the License, or (at your option) any later version. 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ********************************************************************/ 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h> 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/delay.h> 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h> 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/irda/irda.h> 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "sir-dev.h" 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int mcp2120_reset(struct sir_dev *dev); 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int mcp2120_open(struct sir_dev *dev); 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int mcp2120_close(struct sir_dev *dev); 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int mcp2120_change_speed(struct sir_dev *dev, unsigned speed); 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MCP2120_9600 0x87 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MCP2120_19200 0x8B 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MCP2120_38400 0x85 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MCP2120_57600 0x83 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MCP2120_115200 0x81 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MCP2120_COMMIT 0x11 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct dongle_driver mcp2120 = { 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .owner = THIS_MODULE, 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .driver_name = "Microchip MCP2120", 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .type = IRDA_MCP2120_DONGLE, 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .open = mcp2120_open, 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .close = mcp2120_close, 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .reset = mcp2120_reset, 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .set_speed = mcp2120_change_speed, 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init mcp2120_sir_init(void) 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return irda_register_dongle(&mcp2120); 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __exit mcp2120_sir_cleanup(void) 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds irda_unregister_dongle(&mcp2120); 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int mcp2120_open(struct sir_dev *dev) 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct qos_info *qos = &dev->qos; 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 66a97a6f10771b90235b33c13a6db9279237a08422Harvey Harrison IRDA_DEBUG(2, "%s()\n", __func__); 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* seems no explicit power-on required here and reset switching it on anyway */ 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds qos->baud_rate.bits &= IR_9600|IR_19200|IR_38400|IR_57600|IR_115200; 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds qos->min_turn_time.bits = 0x01; 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds irda_qos_bits_to_value(qos); 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int mcp2120_close(struct sir_dev *dev) 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 79a97a6f10771b90235b33c13a6db9279237a08422Harvey Harrison IRDA_DEBUG(2, "%s()\n", __func__); 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Power off dongle */ 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* reset and inhibit mcp2120 */ 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sirdev_set_dtr_rts(dev, TRUE, TRUE); 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds // sirdev_set_dtr_rts(dev, FALSE, FALSE); 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function mcp2120_change_speed (dev, speed) 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Set the speed for the MCP2120. 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MCP2120_STATE_WAIT_SPEED (SIRDEV_STATE_DONGLE_SPEED+1) 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int mcp2120_change_speed(struct sir_dev *dev, unsigned speed) 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned state = dev->fsm.substate; 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned delay = 0; 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 control[2]; 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds static int ret = 0; 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 105a97a6f10771b90235b33c13a6db9279237a08422Harvey Harrison IRDA_DEBUG(2, "%s()\n", __func__); 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (state) { 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SIRDEV_STATE_DONGLE_SPEED: 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Set DTR to enter command mode */ 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sirdev_set_dtr_rts(dev, TRUE, FALSE); 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds udelay(500); 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = 0; 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (speed) { 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds speed = 9600; 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = -EINVAL; 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* fall through */ 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 9600: 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds control[0] = MCP2120_9600; 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds //printk("mcp2120 9600\n"); 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 19200: 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds control[0] = MCP2120_19200; 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds //printk("mcp2120 19200\n"); 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 34800: 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds control[0] = MCP2120_38400; 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds //printk("mcp2120 38400\n"); 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 57600: 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds control[0] = MCP2120_57600; 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds //printk("mcp2120 57600\n"); 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 115200: 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds control[0] = MCP2120_115200; 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds //printk("mcp2120 115200\n"); 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds control[1] = MCP2120_COMMIT; 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Write control bytes */ 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sirdev_raw_write(dev, control, 2); 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->speed = speed; 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds state = MCP2120_STATE_WAIT_SPEED; 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds delay = 100; 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds //printk("mcp2120_change_speed: dongle_speed\n"); 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case MCP2120_STATE_WAIT_SPEED: 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Go back to normal mode */ 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sirdev_set_dtr_rts(dev, FALSE, FALSE); 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds //printk("mcp2120_change_speed: mcp_wait\n"); 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 158a97a6f10771b90235b33c13a6db9279237a08422Harvey Harrison IRDA_ERROR("%s(), undefine state %d\n", __func__, state); 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = -EINVAL; 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->fsm.substate = state; 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (delay > 0) ? delay : ret; 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function mcp2120_reset (driver) 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This function resets the mcp2120 dongle. 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Info: -set RTS to reset mcp2120 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * -set DTR to set mcp2120 software command mode 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * -mcp2120 defaults to 9600 baud after reset 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Algorithm: 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0. Set RTS to reset mcp2120. 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1. Clear RTS and wait for device reset timer of 30 ms (max). 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MCP2120_STATE_WAIT1_RESET (SIRDEV_STATE_DONGLE_RESET+1) 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MCP2120_STATE_WAIT2_RESET (SIRDEV_STATE_DONGLE_RESET+2) 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int mcp2120_reset(struct sir_dev *dev) 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned state = dev->fsm.substate; 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned delay = 0; 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret = 0; 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 190a97a6f10771b90235b33c13a6db9279237a08422Harvey Harrison IRDA_DEBUG(2, "%s()\n", __func__); 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (state) { 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case SIRDEV_STATE_DONGLE_RESET: 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds //printk("mcp2120_reset: dongle_reset\n"); 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Reset dongle by setting RTS*/ 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sirdev_set_dtr_rts(dev, TRUE, TRUE); 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds state = MCP2120_STATE_WAIT1_RESET; 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds delay = 50; 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case MCP2120_STATE_WAIT1_RESET: 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds //printk("mcp2120_reset: mcp2120_wait1\n"); 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* clear RTS and wait for at least 30 ms. */ 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sirdev_set_dtr_rts(dev, FALSE, FALSE); 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds state = MCP2120_STATE_WAIT2_RESET; 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds delay = 50; 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case MCP2120_STATE_WAIT2_RESET: 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds //printk("mcp2120_reset mcp2120_wait2\n"); 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Go back to normal mode */ 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sirdev_set_dtr_rts(dev, FALSE, FALSE); 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 216a97a6f10771b90235b33c13a6db9279237a08422Harvey Harrison IRDA_ERROR("%s(), undefined state %d\n", __func__, state); 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = -EINVAL; 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->fsm.substate = state; 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (delay > 0) ? delay : ret; 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_AUTHOR("Felix Tang <tangf@eyetap.org>"); 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DESCRIPTION("Microchip MCP2120"); 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL"); 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_ALIAS("irda-dongle-9"); /* IRDA_MCP2120_DONGLE */ 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(mcp2120_sir_init); 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_exit(mcp2120_sir_cleanup); 231