Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 133501
b: refs/heads/master
c: faac64a
h: refs/heads/master
i:
  133499: 835dcf7
v: v3
  • Loading branch information
Greg Kroah-Hartman committed Mar 24, 2009
1 parent 721e603 commit 7330528
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 648d4e16567eae4c643bd2125e91128f06c0d3ad
refs/heads/master: faac64ad9c7b1aa56a10be6b5f9b813789e81dfd
65 changes: 64 additions & 1 deletion trunk/drivers/usb/serial/opticon.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <linux/tty.h>
#include <linux/tty_driver.h>
#include <linux/tty_flip.h>
#include <linux/serial.h>
#include <linux/module.h>
#include <linux/usb.h>
#include <linux/usb/serial.h>
Expand Down Expand Up @@ -110,7 +111,6 @@ static void opticon_bulk_callback(struct urb *urb)
priv->rts = false;
else
priv->rts = true;
/* FIXME change the RTS level */
} else {
dev_dbg(&priv->udev->dev,
"Unknown data packet received from the device:"
Expand Down Expand Up @@ -341,6 +341,67 @@ static void opticon_unthrottle(struct tty_struct *tty)
__func__, result);
}

static int opticon_tiocmget(struct tty_struct *tty, struct file *file)
{
struct usb_serial_port *port = tty->driver_data;
struct opticon_private *priv = usb_get_serial_data(port->serial);
unsigned long flags;
int result = 0;

dbg("%s - port %d", __func__, port->number);

spin_lock_irqsave(&priv->lock, flags);
if (priv->rts)
result = TIOCM_RTS;
spin_unlock_irqrestore(&priv->lock, flags);

dbg("%s - %x", __func__, result);
return result;
}

static int get_serial_info(struct opticon_private *priv,
struct serial_struct __user *serial)
{
struct serial_struct tmp;

if (!serial)
return -EFAULT;

memset(&tmp, 0x00, sizeof(tmp));

/* fake emulate a 16550 uart to make userspace code happy */
tmp.type = PORT_16550A;
tmp.line = priv->serial->minor;
tmp.port = 0;
tmp.irq = 0;
tmp.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ;
tmp.xmit_fifo_size = 1024;
tmp.baud_base = 9600;
tmp.close_delay = 5*HZ;
tmp.closing_wait = 30*HZ;

if (copy_to_user(serial, &tmp, sizeof(*serial)))
return -EFAULT;
return 0;
}

static int opticon_ioctl(struct tty_struct *tty, struct file *file,
unsigned int cmd, unsigned long arg)
{
struct usb_serial_port *port = tty->driver_data;
struct opticon_private *priv = usb_get_serial_data(port->serial);

dbg("%s - port %d, cmd = 0x%x", __func__, port->number, cmd);

switch (cmd) {
case TIOCGSERIAL:
return get_serial_info(priv,
(struct serial_struct __user *)arg);
}

return -ENOIOCTLCMD;
}

static int opticon_startup(struct usb_serial *serial)
{
struct opticon_private *priv;
Expand Down Expand Up @@ -475,6 +536,8 @@ static struct usb_serial_driver opticon_device = {
.shutdown = opticon_shutdown,
.throttle = opticon_throttle,
.unthrottle = opticon_unthrottle,
.ioctl = opticon_ioctl,
.tiocmget = opticon_tiocmget,
};

static int __init opticon_init(void)
Expand Down

0 comments on commit 7330528

Please sign in to comment.