static int if_open(struct tty_struct *tty, struct file *filp)
{
struct cardstate *cs;
- unsigned long flags;
gig_dbg(DEBUG_IF, "%d+%d: %s()",
tty->driver->minor_start, tty->index, __func__);
}
tty->driver_data = cs;
- ++cs->open_count;
+ ++cs->port.count;
- if (cs->open_count == 1) {
- spin_lock_irqsave(&cs->lock, flags);
- cs->tty = tty;
- spin_unlock_irqrestore(&cs->lock, flags);
+ if (cs->port.count == 1) {
+ tty_port_tty_set(&cs->port, tty);
tty->low_latency = 1;
}
static void if_close(struct tty_struct *tty, struct file *filp)
{
struct cardstate *cs = tty->driver_data;
- unsigned long flags;
if (!cs) { /* happens if we didn't find cs in open */
printk(KERN_DEBUG "%s: no cardstate\n", __func__);
if (!cs->connected)
gig_dbg(DEBUG_IF, "not connected"); /* nothing to do */
- else if (!cs->open_count)
+ else if (!cs->port.count)
dev_warn(cs->dev, "%s: device not opened\n", __func__);
- else {
- if (!--cs->open_count) {
- spin_lock_irqsave(&cs->lock, flags);
- cs->tty = NULL;
- spin_unlock_irqrestore(&cs->lock, flags);
- }
- }
+ else if (!--cs->port.count)
+ tty_port_tty_set(&cs->port, NULL);
mutex_unlock(&cs->mutex);
/* wakeup tasklet for the write operation */
static void if_wake(unsigned long data)
{
- struct cardstate *cs = (struct cardstate *) data;
+ struct cardstate *cs = (struct cardstate *)data;
+ struct tty_struct *tty = tty_port_tty_get(&cs->port);
- if (cs->tty)
- tty_wakeup(cs->tty);
+ if (tty) {
+ tty_wakeup(tty);
+ tty_kref_put(tty);
+ }
}
/*** interface to common ***/
void gigaset_if_receive(struct cardstate *cs,
unsigned char *buffer, size_t len)
{
- unsigned long flags;
- struct tty_struct *tty;
+ struct tty_struct *tty = tty_port_tty_get(&cs->port);
- spin_lock_irqsave(&cs->lock, flags);
- tty = cs->tty;
- if (tty == NULL)
+ if (tty == NULL) {
gig_dbg(DEBUG_IF, "receive on closed device");
- else {
- tty_insert_flip_string(tty, buffer, len);
- tty_flip_buffer_push(tty);
+ return;
}
- spin_unlock_irqrestore(&cs->lock, flags);
+
+ tty_insert_flip_string(tty, buffer, len);
+ tty_flip_buffer_push(tty);
+ tty_kref_put(tty);
}
EXPORT_SYMBOL_GPL(gigaset_if_receive);