if (request->payload_size < sizeof(*receive_data)) {
dev_err(&gb_tty->gbphy_dev->dev,
- "short receive-data request received (%zu < %zu)\n",
- request->payload_size, sizeof(*receive_data));
+ "short receive-data request received (%zu < %zu)\n",
+ request->payload_size, sizeof(*receive_data));
return -EINVAL;
}
if (recv_data_size != request->payload_size - sizeof(*receive_data)) {
dev_err(&gb_tty->gbphy_dev->dev,
- "malformed receive-data request received (%u != %zu)\n",
- recv_data_size,
- request->payload_size - sizeof(*receive_data));
+ "malformed receive-data request received (%u != %zu)\n",
+ recv_data_size,
+ request->payload_size - sizeof(*receive_data));
return -EINVAL;
}
if (request->payload_size < sizeof(*serial_state)) {
dev_err(&gb_tty->gbphy_dev->dev,
- "short serial-state event received (%zu < %zu)\n",
- request->payload_size, sizeof(*serial_state));
+ "short serial-state event received (%zu < %zu)\n",
+ request->payload_size, sizeof(*serial_state));
return -EINVAL;
}
if (request->payload_size < sizeof(*credit_request)) {
dev_err(&gb_tty->gbphy_dev->dev,
- "short receive_credits event received (%zu < %zu)\n",
- request->payload_size,
- sizeof(*credit_request));
+ "short receive_credits event received (%zu < %zu)\n",
+ request->payload_size,
+ sizeof(*credit_request));
return -EINVAL;
}
send_size = gb_tty->credits;
send_size = kfifo_out_peek(&gb_tty->write_fifo,
- &request->data[0],
- send_size);
+ &request->data[0],
+ send_size);
if (!send_size) {
spin_unlock_irqrestore(&gb_tty->write_lock, flags);
break;
&request, sizeof(request), NULL, 0);
}
-static struct gb_tty *get_gb_by_minor(unsigned minor)
+static struct gb_tty *get_gb_by_minor(unsigned int minor)
{
struct gb_tty *gb_tty;
struct gb_tty *gb_tty = tty->driver_data;
count = kfifo_in_spinlocked(&gb_tty->write_fifo, buf, count,
- &gb_tty->write_lock);
+ &gb_tty->write_lock);
if (count && !gb_tty->close_pending)
schedule_work(&gb_tty->tx_work);
gb_tty->ctrlout &= ~GB_UART_CTRL_RTS;
retval = send_control(gb_tty, gb_tty->ctrlout);
}
-
}
static void gb_tty_unthrottle(struct tty_struct *tty)
} while (!retval);
return retval;
-
}
static int get_serial_usage(struct gb_tty *gb_tty,
send_control(gb_tty, newctrl);
}
+static int gb_tty_port_activate(struct tty_port *port,
+ struct tty_struct *tty)
+{
+ struct gb_tty *gb_tty;
+
+ gb_tty = container_of(port, struct gb_tty, port);
+
+ return gbphy_runtime_get_sync(gb_tty->gbphy_dev);
+}
+
static void gb_tty_port_shutdown(struct tty_port *port)
{
struct gb_tty *gb_tty;
out:
gb_tty->close_pending = false;
+
+ gbphy_runtime_put_autosuspend(gb_tty->gbphy_dev);
}
static const struct tty_operations gb_ops = {
static struct tty_port_operations gb_port_ops = {
.dtr_rts = gb_tty_dtr_rts,
+ .activate = gb_tty_port_activate,
.shutdown = gb_tty_port_shutdown,
};
INIT_WORK(&gb_tty->tx_work, gb_uart_tx_write_work);
retval = kfifo_alloc(&gb_tty->write_fifo, GB_UART_WRITE_FIFO_SIZE,
- GFP_KERNEL);
+ GFP_KERNEL);
if (retval)
goto exit_buf_free;
minor = alloc_minor(gb_tty);
if (minor < 0) {
if (minor == -ENOSPC) {
- dev_err(&connection->bundle->dev,
+ dev_err(&gbphy_dev->dev,
"no more free minor numbers\n");
retval = -ENODEV;
} else {
if (retval)
goto exit_release_minor;
- retval = gb_gbphy_get_version(connection);
- if (retval)
- goto exit_connection_disable;
-
send_control(gb_tty, gb_tty->ctrlout);
/* initialize the uart to be 9600n81 */
goto exit_connection_disable;
}
-
+ gbphy_runtime_put_autosuspend(gbphy_dev);
return 0;
exit_connection_disable:
struct gb_tty *gb_tty = gb_gbphy_get_data(gbphy_dev);
struct gb_connection *connection = gb_tty->connection;
struct tty_struct *tty;
+ int ret;
+
+ ret = gbphy_runtime_get_sync(gbphy_dev);
+ if (ret)
+ gbphy_runtime_get_noresume(gbphy_dev);
mutex_lock(&gb_tty->mutex);
gb_tty->disconnected = true;
gb_connection_disable(connection);
tty_port_destroy(&gb_tty->port);
gb_connection_destroy(connection);
+ release_minor(gb_tty);
kfifo_free(&gb_tty->write_fifo);
kfree(gb_tty->buffer);
kfree(gb_tty);