Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
   1/*
   2 * UART driver for the Greybus "generic" UART module.
   3 *
   4 * Copyright 2014 Google Inc.
   5 * Copyright 2014 Linaro Ltd.
   6 *
   7 * Released under the GPLv2 only.
   8 *
   9 * Heavily based on drivers/usb/class/cdc-acm.c and
  10 * drivers/usb/serial/usb-serial.c.
  11 */
  12#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  13
  14#include <linux/kernel.h>
  15#include <linux/errno.h>
  16#include <linux/module.h>
  17#include <linux/sched.h>
  18#include <linux/wait.h>
  19#include <linux/slab.h>
  20#include <linux/uaccess.h>
  21#include <linux/mutex.h>
  22#include <linux/tty.h>
  23#include <linux/serial.h>
  24#include <linux/tty_driver.h>
  25#include <linux/tty_flip.h>
  26#include <linux/serial.h>
  27#include <linux/idr.h>
  28#include <linux/fs.h>
  29#include <linux/kdev_t.h>
  30#include <linux/kfifo.h>
  31#include <linux/workqueue.h>
  32#include <linux/completion.h>
  33
  34#include "greybus.h"
  35#include "gbphy.h"
  36
  37#define GB_NUM_MINORS	16	/* 16 is is more than enough */
  38#define GB_NAME		"ttyGB"
  39
  40#define GB_UART_WRITE_FIFO_SIZE		PAGE_SIZE
  41#define GB_UART_WRITE_ROOM_MARGIN	1	/* leave some space in fifo */
  42#define GB_UART_FIRMWARE_CREDITS	4096
  43#define GB_UART_CREDIT_WAIT_TIMEOUT_MSEC	10000
  44
  45struct gb_tty_line_coding {
  46	__le32	rate;
  47	__u8	format;
  48	__u8	parity;
  49	__u8	data_bits;
  50	__u8	flow_control;
  51};
  52
  53struct gb_tty {
  54	struct gbphy_device *gbphy_dev;
  55	struct tty_port port;
  56	void *buffer;
  57	size_t buffer_payload_max;
  58	struct gb_connection *connection;
  59	u16 cport_id;
  60	unsigned int minor;
  61	unsigned char clocal;
  62	bool disconnected;
  63	spinlock_t read_lock;
  64	spinlock_t write_lock;
  65	struct async_icount iocount;
  66	struct async_icount oldcount;
  67	wait_queue_head_t wioctl;
  68	struct mutex mutex;
  69	u8 ctrlin;	/* input control lines */
  70	u8 ctrlout;	/* output control lines */
  71	struct gb_tty_line_coding line_coding;
  72	struct work_struct tx_work;
  73	struct kfifo write_fifo;
  74	bool close_pending;
  75	unsigned int credits;
  76	struct completion credits_complete;
  77};
  78
  79static struct tty_driver *gb_tty_driver;
  80static DEFINE_IDR(tty_minors);
  81static DEFINE_MUTEX(table_lock);
  82
  83static int gb_uart_receive_data_handler(struct gb_operation *op)
  84{
  85	struct gb_connection *connection = op->connection;
  86	struct gb_tty *gb_tty = gb_connection_get_data(connection);
  87	struct tty_port *port = &gb_tty->port;
  88	struct gb_message *request = op->request;
  89	struct gb_uart_recv_data_request *receive_data;
  90	u16 recv_data_size;
  91	int count;
  92	unsigned long tty_flags = TTY_NORMAL;
  93
  94	if (request->payload_size < sizeof(*receive_data)) {
  95		dev_err(&gb_tty->gbphy_dev->dev,
  96			"short receive-data request received (%zu < %zu)\n",
  97			request->payload_size, sizeof(*receive_data));
  98		return -EINVAL;
  99	}
 100
 101	receive_data = op->request->payload;
 102	recv_data_size = le16_to_cpu(receive_data->size);
 103
 104	if (recv_data_size != request->payload_size - sizeof(*receive_data)) {
 105		dev_err(&gb_tty->gbphy_dev->dev,
 106			"malformed receive-data request received (%u != %zu)\n",
 107			recv_data_size,
 108			request->payload_size - sizeof(*receive_data));
 109		return -EINVAL;
 110	}
 111
 112	if (!recv_data_size)
 113		return -EINVAL;
 114
 115	if (receive_data->flags) {
 116		if (receive_data->flags & GB_UART_RECV_FLAG_BREAK)
 117			tty_flags = TTY_BREAK;
 118		else if (receive_data->flags & GB_UART_RECV_FLAG_PARITY)
 119			tty_flags = TTY_PARITY;
 120		else if (receive_data->flags & GB_UART_RECV_FLAG_FRAMING)
 121			tty_flags = TTY_FRAME;
 122
 123		/* overrun is special, not associated with a char */
 124		if (receive_data->flags & GB_UART_RECV_FLAG_OVERRUN)
 125			tty_insert_flip_char(port, 0, TTY_OVERRUN);
 126	}
 127	count = tty_insert_flip_string_fixed_flag(port, receive_data->data,
 128						  tty_flags, recv_data_size);
 129	if (count != recv_data_size) {
 130		dev_err(&gb_tty->gbphy_dev->dev,
 131			"UART: RX 0x%08x bytes only wrote 0x%08x\n",
 132			recv_data_size, count);
 133	}
 134	if (count)
 135		tty_flip_buffer_push(port);
 136	return 0;
 137}
 138
 139static int gb_uart_serial_state_handler(struct gb_operation *op)
 140{
 141	struct gb_connection *connection = op->connection;
 142	struct gb_tty *gb_tty = gb_connection_get_data(connection);
 143	struct gb_message *request = op->request;
 144	struct gb_uart_serial_state_request *serial_state;
 145
 146	if (request->payload_size < sizeof(*serial_state)) {
 147		dev_err(&gb_tty->gbphy_dev->dev,
 148			"short serial-state event received (%zu < %zu)\n",
 149			request->payload_size, sizeof(*serial_state));
 150		return -EINVAL;
 151	}
 152
 153	serial_state = request->payload;
 154	gb_tty->ctrlin = serial_state->control;
 155
 156	return 0;
 157}
 158
 159static int gb_uart_receive_credits_handler(struct gb_operation *op)
 160{
 161	struct gb_connection *connection = op->connection;
 162	struct gb_tty *gb_tty = gb_connection_get_data(connection);
 163	struct gb_message *request = op->request;
 164	struct gb_uart_receive_credits_request *credit_request;
 165	unsigned long flags;
 166	unsigned int incoming_credits;
 167	int ret = 0;
 168
 169	if (request->payload_size < sizeof(*credit_request)) {
 170		dev_err(&gb_tty->gbphy_dev->dev,
 171			"short receive_credits event received (%zu < %zu)\n",
 172			request->payload_size,
 173			sizeof(*credit_request));
 174		return -EINVAL;
 175	}
 176
 177	credit_request = request->payload;
 178	incoming_credits = le16_to_cpu(credit_request->count);
 179
 180	spin_lock_irqsave(&gb_tty->write_lock, flags);
 181	gb_tty->credits += incoming_credits;
 182	if (gb_tty->credits > GB_UART_FIRMWARE_CREDITS) {
 183		gb_tty->credits -= incoming_credits;
 184		ret = -EINVAL;
 185	}
 186	spin_unlock_irqrestore(&gb_tty->write_lock, flags);
 187
 188	if (ret) {
 189		dev_err(&gb_tty->gbphy_dev->dev,
 190			"invalid number of incoming credits: %d\n",
 191			incoming_credits);
 192		return ret;
 193	}
 194
 195	if (!gb_tty->close_pending)
 196		schedule_work(&gb_tty->tx_work);
 197
 198	/*
 199	 * the port the tty layer may be waiting for credits
 200	 */
 201	tty_port_tty_wakeup(&gb_tty->port);
 202
 203	if (gb_tty->credits == GB_UART_FIRMWARE_CREDITS)
 204		complete(&gb_tty->credits_complete);
 205
 206	return ret;
 207}
 208
 209static int gb_uart_request_handler(struct gb_operation *op)
 210{
 211	struct gb_connection *connection = op->connection;
 212	struct gb_tty *gb_tty = gb_connection_get_data(connection);
 213	int type = op->type;
 214	int ret;
 215
 216	switch (type) {
 217	case GB_UART_TYPE_RECEIVE_DATA:
 218		ret = gb_uart_receive_data_handler(op);
 219		break;
 220	case GB_UART_TYPE_SERIAL_STATE:
 221		ret = gb_uart_serial_state_handler(op);
 222		break;
 223	case GB_UART_TYPE_RECEIVE_CREDITS:
 224		ret = gb_uart_receive_credits_handler(op);
 225		break;
 226	default:
 227		dev_err(&gb_tty->gbphy_dev->dev,
 228			"unsupported unsolicited request: 0x%02x\n", type);
 229		ret = -EINVAL;
 230	}
 231
 232	return ret;
 233}
 234
 235static void  gb_uart_tx_write_work(struct work_struct *work)
 236{
 237	struct gb_uart_send_data_request *request;
 238	struct gb_tty *gb_tty;
 239	unsigned long flags;
 240	unsigned int send_size;
 241	int ret;
 242
 243	gb_tty = container_of(work, struct gb_tty, tx_work);
 244	request = gb_tty->buffer;
 245
 246	while (1) {
 247		if (gb_tty->close_pending)
 248			break;
 249
 250		spin_lock_irqsave(&gb_tty->write_lock, flags);
 251		send_size = gb_tty->buffer_payload_max;
 252		if (send_size > gb_tty->credits)
 253			send_size = gb_tty->credits;
 254
 255		send_size = kfifo_out_peek(&gb_tty->write_fifo,
 256					   &request->data[0],
 257					   send_size);
 258		if (!send_size) {
 259			spin_unlock_irqrestore(&gb_tty->write_lock, flags);
 260			break;
 261		}
 262
 263		gb_tty->credits -= send_size;
 264		spin_unlock_irqrestore(&gb_tty->write_lock, flags);
 265
 266		request->size = cpu_to_le16(send_size);
 267		ret = gb_operation_sync(gb_tty->connection,
 268					GB_UART_TYPE_SEND_DATA,
 269					request, sizeof(*request) + send_size,
 270					NULL, 0);
 271		if (ret) {
 272			dev_err(&gb_tty->gbphy_dev->dev,
 273				"send data error: %d\n", ret);
 274			spin_lock_irqsave(&gb_tty->write_lock, flags);
 275			gb_tty->credits += send_size;
 276			spin_unlock_irqrestore(&gb_tty->write_lock, flags);
 277			if (!gb_tty->close_pending)
 278				schedule_work(work);
 279			return;
 280		}
 281
 282		spin_lock_irqsave(&gb_tty->write_lock, flags);
 283		ret = kfifo_out(&gb_tty->write_fifo, &request->data[0],
 284				send_size);
 285		spin_unlock_irqrestore(&gb_tty->write_lock, flags);
 286
 287		tty_port_tty_wakeup(&gb_tty->port);
 288	}
 289}
 290
 291static int send_line_coding(struct gb_tty *tty)
 292{
 293	struct gb_uart_set_line_coding_request request;
 294
 295	memcpy(&request, &tty->line_coding,
 296	       sizeof(tty->line_coding));
 297	return gb_operation_sync(tty->connection, GB_UART_TYPE_SET_LINE_CODING,
 298				 &request, sizeof(request), NULL, 0);
 299}
 300
 301static int send_control(struct gb_tty *gb_tty, u8 control)
 302{
 303	struct gb_uart_set_control_line_state_request request;
 304
 305	request.control = control;
 306	return gb_operation_sync(gb_tty->connection,
 307				 GB_UART_TYPE_SET_CONTROL_LINE_STATE,
 308				 &request, sizeof(request), NULL, 0);
 309}
 310
 311static int send_break(struct gb_tty *gb_tty, u8 state)
 312{
 313	struct gb_uart_set_break_request request;
 314
 315	if ((state != 0) && (state != 1)) {
 316		dev_err(&gb_tty->gbphy_dev->dev,
 317			"invalid break state of %d\n", state);
 318		return -EINVAL;
 319	}
 320
 321	request.state = state;
 322	return gb_operation_sync(gb_tty->connection, GB_UART_TYPE_SEND_BREAK,
 323				 &request, sizeof(request), NULL, 0);
 324}
 325
 326static int gb_uart_wait_for_all_credits(struct gb_tty *gb_tty)
 327{
 328	int ret;
 329
 330	if (gb_tty->credits == GB_UART_FIRMWARE_CREDITS)
 331		return 0;
 332
 333	ret = wait_for_completion_timeout(&gb_tty->credits_complete,
 334			msecs_to_jiffies(GB_UART_CREDIT_WAIT_TIMEOUT_MSEC));
 335	if (!ret) {
 336		dev_err(&gb_tty->gbphy_dev->dev,
 337			"time out waiting for credits\n");
 338		return -ETIMEDOUT;
 339	}
 340
 341	return 0;
 342}
 343
 344static int gb_uart_flush(struct gb_tty *gb_tty, u8 flags)
 345{
 346	struct gb_uart_serial_flush_request request;
 347
 348	request.flags = flags;
 349	return gb_operation_sync(gb_tty->connection, GB_UART_TYPE_FLUSH_FIFOS,
 350				 &request, sizeof(request), NULL, 0);
 351}
 352
 353static struct gb_tty *get_gb_by_minor(unsigned int minor)
 354{
 355	struct gb_tty *gb_tty;
 356
 357	mutex_lock(&table_lock);
 358	gb_tty = idr_find(&tty_minors, minor);
 359	if (gb_tty) {
 360		mutex_lock(&gb_tty->mutex);
 361		if (gb_tty->disconnected) {
 362			mutex_unlock(&gb_tty->mutex);
 363			gb_tty = NULL;
 364		} else {
 365			tty_port_get(&gb_tty->port);
 366			mutex_unlock(&gb_tty->mutex);
 367		}
 368	}
 369	mutex_unlock(&table_lock);
 370	return gb_tty;
 371}
 372
 373static int alloc_minor(struct gb_tty *gb_tty)
 374{
 375	int minor;
 376
 377	mutex_lock(&table_lock);
 378	minor = idr_alloc(&tty_minors, gb_tty, 0, GB_NUM_MINORS, GFP_KERNEL);
 379	mutex_unlock(&table_lock);
 380	if (minor >= 0)
 381		gb_tty->minor = minor;
 382	return minor;
 383}
 384
 385static void release_minor(struct gb_tty *gb_tty)
 386{
 387	int minor = gb_tty->minor;
 388
 389	gb_tty->minor = 0;	/* Maybe should use an invalid value instead */
 390	mutex_lock(&table_lock);
 391	idr_remove(&tty_minors, minor);
 392	mutex_unlock(&table_lock);
 393}
 394
 395static int gb_tty_install(struct tty_driver *driver, struct tty_struct *tty)
 396{
 397	struct gb_tty *gb_tty;
 398	int retval;
 399
 400	gb_tty = get_gb_by_minor(tty->index);
 401	if (!gb_tty)
 402		return -ENODEV;
 403
 404	retval = tty_standard_install(driver, tty);
 405	if (retval)
 406		goto error;
 407
 408	tty->driver_data = gb_tty;
 409	return 0;
 410error:
 411	tty_port_put(&gb_tty->port);
 412	return retval;
 413}
 414
 415static int gb_tty_open(struct tty_struct *tty, struct file *file)
 416{
 417	struct gb_tty *gb_tty = tty->driver_data;
 418
 419	return tty_port_open(&gb_tty->port, tty, file);
 420}
 421
 422static void gb_tty_close(struct tty_struct *tty, struct file *file)
 423{
 424	struct gb_tty *gb_tty = tty->driver_data;
 425
 426	tty_port_close(&gb_tty->port, tty, file);
 427}
 428
 429static void gb_tty_cleanup(struct tty_struct *tty)
 430{
 431	struct gb_tty *gb_tty = tty->driver_data;
 432
 433	tty_port_put(&gb_tty->port);
 434}
 435
 436static void gb_tty_hangup(struct tty_struct *tty)
 437{
 438	struct gb_tty *gb_tty = tty->driver_data;
 439
 440	tty_port_hangup(&gb_tty->port);
 441}
 442
 443static int gb_tty_write(struct tty_struct *tty, const unsigned char *buf,
 444			int count)
 445{
 446	struct gb_tty *gb_tty = tty->driver_data;
 447
 448	count =  kfifo_in_spinlocked(&gb_tty->write_fifo, buf, count,
 449				     &gb_tty->write_lock);
 450	if (count && !gb_tty->close_pending)
 451		schedule_work(&gb_tty->tx_work);
 452
 453	return count;
 454}
 455
 456static int gb_tty_write_room(struct tty_struct *tty)
 457{
 458	struct gb_tty *gb_tty = tty->driver_data;
 459	unsigned long flags;
 460	int room;
 461
 462	spin_lock_irqsave(&gb_tty->write_lock, flags);
 463	room = kfifo_avail(&gb_tty->write_fifo);
 464	spin_unlock_irqrestore(&gb_tty->write_lock, flags);
 465
 466	room -= GB_UART_WRITE_ROOM_MARGIN;
 467	if (room < 0)
 468		return 0;
 469
 470	return room;
 471}
 472
 473static int gb_tty_chars_in_buffer(struct tty_struct *tty)
 474{
 475	struct gb_tty *gb_tty = tty->driver_data;
 476	unsigned long flags;
 477	int chars;
 478
 479	spin_lock_irqsave(&gb_tty->write_lock, flags);
 480	chars = kfifo_len(&gb_tty->write_fifo);
 481	if (gb_tty->credits < GB_UART_FIRMWARE_CREDITS)
 482		chars += GB_UART_FIRMWARE_CREDITS - gb_tty->credits;
 483	spin_unlock_irqrestore(&gb_tty->write_lock, flags);
 484
 485	return chars;
 486}
 487
 488static int gb_tty_break_ctl(struct tty_struct *tty, int state)
 489{
 490	struct gb_tty *gb_tty = tty->driver_data;
 491
 492	return send_break(gb_tty, state ? 1 : 0);
 493}
 494
 495static void gb_tty_set_termios(struct tty_struct *tty,
 496			       struct ktermios *termios_old)
 497{
 498	struct gb_tty *gb_tty = tty->driver_data;
 499	struct ktermios *termios = &tty->termios;
 500	struct gb_tty_line_coding newline;
 501	u8 newctrl = gb_tty->ctrlout;
 502
 503	newline.rate = cpu_to_le32(tty_get_baud_rate(tty));
 504	newline.format = termios->c_cflag & CSTOPB ?
 505				GB_SERIAL_2_STOP_BITS : GB_SERIAL_1_STOP_BITS;
 506	newline.parity = termios->c_cflag & PARENB ?
 507				(termios->c_cflag & PARODD ? 1 : 2) +
 508				(termios->c_cflag & CMSPAR ? 2 : 0) : 0;
 509
 510	switch (termios->c_cflag & CSIZE) {
 511	case CS5:
 512		newline.data_bits = 5;
 513		break;
 514	case CS6:
 515		newline.data_bits = 6;
 516		break;
 517	case CS7:
 518		newline.data_bits = 7;
 519		break;
 520	case CS8:
 521	default:
 522		newline.data_bits = 8;
 523		break;
 524	}
 525
 526	/* FIXME: needs to clear unsupported bits in the termios */
 527	gb_tty->clocal = ((termios->c_cflag & CLOCAL) != 0);
 528
 529	if (C_BAUD(tty) == B0) {
 530		newline.rate = gb_tty->line_coding.rate;
 531		newctrl &= ~(GB_UART_CTRL_DTR | GB_UART_CTRL_RTS);
 532	} else if (termios_old && (termios_old->c_cflag & CBAUD) == B0) {
 533		newctrl |= (GB_UART_CTRL_DTR | GB_UART_CTRL_RTS);
 534	}
 535
 536	if (newctrl != gb_tty->ctrlout) {
 537		gb_tty->ctrlout = newctrl;
 538		send_control(gb_tty, newctrl);
 539	}
 540
 541	if (C_CRTSCTS(tty) && C_BAUD(tty) != B0)
 542		newline.flow_control |= GB_SERIAL_AUTO_RTSCTS_EN;
 543	else
 544		newline.flow_control &= ~GB_SERIAL_AUTO_RTSCTS_EN;
 545
 546	if (memcmp(&gb_tty->line_coding, &newline, sizeof(newline))) {
 547		memcpy(&gb_tty->line_coding, &newline, sizeof(newline));
 548		send_line_coding(gb_tty);
 549	}
 550}
 551
 552static int gb_tty_tiocmget(struct tty_struct *tty)
 553{
 554	struct gb_tty *gb_tty = tty->driver_data;
 555
 556	return (gb_tty->ctrlout & GB_UART_CTRL_DTR ? TIOCM_DTR : 0) |
 557	       (gb_tty->ctrlout & GB_UART_CTRL_RTS ? TIOCM_RTS : 0) |
 558	       (gb_tty->ctrlin  & GB_UART_CTRL_DSR ? TIOCM_DSR : 0) |
 559	       (gb_tty->ctrlin  & GB_UART_CTRL_RI  ? TIOCM_RI  : 0) |
 560	       (gb_tty->ctrlin  & GB_UART_CTRL_DCD ? TIOCM_CD  : 0) |
 561	       TIOCM_CTS;
 562}
 563
 564static int gb_tty_tiocmset(struct tty_struct *tty, unsigned int set,
 565			   unsigned int clear)
 566{
 567	struct gb_tty *gb_tty = tty->driver_data;
 568	u8 newctrl = gb_tty->ctrlout;
 569
 570	set = (set & TIOCM_DTR ? GB_UART_CTRL_DTR : 0) |
 571	      (set & TIOCM_RTS ? GB_UART_CTRL_RTS : 0);
 572	clear = (clear & TIOCM_DTR ? GB_UART_CTRL_DTR : 0) |
 573		(clear & TIOCM_RTS ? GB_UART_CTRL_RTS : 0);
 574
 575	newctrl = (newctrl & ~clear) | set;
 576	if (gb_tty->ctrlout == newctrl)
 577		return 0;
 578
 579	gb_tty->ctrlout = newctrl;
 580	return send_control(gb_tty, newctrl);
 581}
 582
 583static void gb_tty_throttle(struct tty_struct *tty)
 584{
 585	struct gb_tty *gb_tty = tty->driver_data;
 586	unsigned char stop_char;
 587	int retval;
 588
 589	if (I_IXOFF(tty)) {
 590		stop_char = STOP_CHAR(tty);
 591		retval = gb_tty_write(tty, &stop_char, 1);
 592		if (retval <= 0)
 593			return;
 594	}
 595
 596	if (tty->termios.c_cflag & CRTSCTS) {
 597		gb_tty->ctrlout &= ~GB_UART_CTRL_RTS;
 598		retval = send_control(gb_tty, gb_tty->ctrlout);
 599	}
 600}
 601
 602static void gb_tty_unthrottle(struct tty_struct *tty)
 603{
 604	struct gb_tty *gb_tty = tty->driver_data;
 605	unsigned char start_char;
 606	int retval;
 607
 608	if (I_IXOFF(tty)) {
 609		start_char = START_CHAR(tty);
 610		retval = gb_tty_write(tty, &start_char, 1);
 611		if (retval <= 0)
 612			return;
 613	}
 614
 615	if (tty->termios.c_cflag & CRTSCTS) {
 616		gb_tty->ctrlout |= GB_UART_CTRL_RTS;
 617		retval = send_control(gb_tty, gb_tty->ctrlout);
 618	}
 619}
 620
 621static int get_serial_info(struct gb_tty *gb_tty,
 622			   struct serial_struct __user *info)
 623{
 624	struct serial_struct tmp;
 625
 626	memset(&tmp, 0, sizeof(tmp));
 627	tmp.flags = ASYNC_LOW_LATENCY | ASYNC_SKIP_TEST;
 628	tmp.type = PORT_16550A;
 629	tmp.line = gb_tty->minor;
 630	tmp.xmit_fifo_size = 16;
 631	tmp.baud_base = 9600;
 632	tmp.close_delay = gb_tty->port.close_delay / 10;
 633	tmp.closing_wait = gb_tty->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
 634				ASYNC_CLOSING_WAIT_NONE : gb_tty->port.closing_wait / 10;
 635
 636	if (copy_to_user(info, &tmp, sizeof(tmp)))
 637		return -EFAULT;
 638	return 0;
 639}
 640
 641static int set_serial_info(struct gb_tty *gb_tty,
 642			   struct serial_struct __user *newinfo)
 643{
 644	struct serial_struct new_serial;
 645	unsigned int closing_wait;
 646	unsigned int close_delay;
 647	int retval = 0;
 648
 649	if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
 650		return -EFAULT;
 651
 652	close_delay = new_serial.close_delay * 10;
 653	closing_wait = new_serial.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
 654			ASYNC_CLOSING_WAIT_NONE : new_serial.closing_wait * 10;
 655
 656	mutex_lock(&gb_tty->port.mutex);
 657	if (!capable(CAP_SYS_ADMIN)) {
 658		if ((close_delay != gb_tty->port.close_delay) ||
 659		    (closing_wait != gb_tty->port.closing_wait))
 660			retval = -EPERM;
 661		else
 662			retval = -EOPNOTSUPP;
 663	} else {
 664		gb_tty->port.close_delay = close_delay;
 665		gb_tty->port.closing_wait = closing_wait;
 666	}
 667	mutex_unlock(&gb_tty->port.mutex);
 668	return retval;
 669}
 670
 671static int wait_serial_change(struct gb_tty *gb_tty, unsigned long arg)
 672{
 673	int retval = 0;
 674	DECLARE_WAITQUEUE(wait, current);
 675	struct async_icount old;
 676	struct async_icount new;
 677
 678	if (!(arg & (TIOCM_DSR | TIOCM_RI | TIOCM_CD)))
 679		return -EINVAL;
 680
 681	do {
 682		spin_lock_irq(&gb_tty->read_lock);
 683		old = gb_tty->oldcount;
 684		new = gb_tty->iocount;
 685		gb_tty->oldcount = new;
 686		spin_unlock_irq(&gb_tty->read_lock);
 687
 688		if ((arg & TIOCM_DSR) && (old.dsr != new.dsr))
 689			break;
 690		if ((arg & TIOCM_CD) && (old.dcd != new.dcd))
 691			break;
 692		if ((arg & TIOCM_RI) && (old.rng != new.rng))
 693			break;
 694
 695		add_wait_queue(&gb_tty->wioctl, &wait);
 696		set_current_state(TASK_INTERRUPTIBLE);
 697		schedule();
 698		remove_wait_queue(&gb_tty->wioctl, &wait);
 699		if (gb_tty->disconnected) {
 700			if (arg & TIOCM_CD)
 701				break;
 702			retval = -ENODEV;
 703		} else if (signal_pending(current)) {
 704			retval = -ERESTARTSYS;
 705		}
 706	} while (!retval);
 707
 708	return retval;
 709}
 710
 711static int gb_tty_get_icount(struct tty_struct *tty,
 712			     struct serial_icounter_struct *icount)
 713{
 714	struct gb_tty *gb_tty = tty->driver_data;
 715
 716	icount->dsr = gb_tty->iocount.dsr;
 717	icount->rng = gb_tty->iocount.rng;
 718	icount->dcd = gb_tty->iocount.dcd;
 719	icount->frame = gb_tty->iocount.frame;
 720	icount->overrun = gb_tty->iocount.overrun;
 721	icount->parity = gb_tty->iocount.parity;
 722	icount->brk = gb_tty->iocount.brk;
 723
 724	return 0;
 725}
 726
 727static int gb_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
 728			unsigned long arg)
 729{
 730	struct gb_tty *gb_tty = tty->driver_data;
 731
 732	switch (cmd) {
 733	case TIOCGSERIAL:
 734		return get_serial_info(gb_tty,
 735				       (struct serial_struct __user *)arg);
 736	case TIOCSSERIAL:
 737		return set_serial_info(gb_tty,
 738				       (struct serial_struct __user *)arg);
 739	case TIOCMIWAIT:
 740		return wait_serial_change(gb_tty, arg);
 741	}
 742
 743	return -ENOIOCTLCMD;
 744}
 745
 746static void gb_tty_dtr_rts(struct tty_port *port, int on)
 747{
 748	struct gb_tty *gb_tty;
 749	u8 newctrl;
 750
 751	gb_tty = container_of(port, struct gb_tty, port);
 752	newctrl = gb_tty->ctrlout;
 753
 754	if (on)
 755		newctrl |= (GB_UART_CTRL_DTR | GB_UART_CTRL_RTS);
 756	else
 757		newctrl &= ~(GB_UART_CTRL_DTR | GB_UART_CTRL_RTS);
 758
 759	gb_tty->ctrlout = newctrl;
 760	send_control(gb_tty, newctrl);
 761}
 762
 763static int gb_tty_port_activate(struct tty_port *port,
 764				struct tty_struct *tty)
 765{
 766	struct gb_tty *gb_tty;
 767
 768	gb_tty = container_of(port, struct gb_tty, port);
 769
 770	return gbphy_runtime_get_sync(gb_tty->gbphy_dev);
 771}
 772
 773static void gb_tty_port_shutdown(struct tty_port *port)
 774{
 775	struct gb_tty *gb_tty;
 776	unsigned long flags;
 777	int ret;
 778
 779	gb_tty = container_of(port, struct gb_tty, port);
 780
 781	gb_tty->close_pending = true;
 782
 783	cancel_work_sync(&gb_tty->tx_work);
 784
 785	spin_lock_irqsave(&gb_tty->write_lock, flags);
 786	kfifo_reset_out(&gb_tty->write_fifo);
 787	spin_unlock_irqrestore(&gb_tty->write_lock, flags);
 788
 789	if (gb_tty->credits == GB_UART_FIRMWARE_CREDITS)
 790		goto out;
 791
 792	ret = gb_uart_flush(gb_tty, GB_SERIAL_FLAG_FLUSH_TRANSMITTER);
 793	if (ret) {
 794		dev_err(&gb_tty->gbphy_dev->dev,
 795			"error flushing transmitter: %d\n", ret);
 796	}
 797
 798	gb_uart_wait_for_all_credits(gb_tty);
 799
 800out:
 801	gb_tty->close_pending = false;
 802
 803	gbphy_runtime_put_autosuspend(gb_tty->gbphy_dev);
 804}
 805
 806static const struct tty_operations gb_ops = {
 807	.install =		gb_tty_install,
 808	.open =			gb_tty_open,
 809	.close =		gb_tty_close,
 810	.cleanup =		gb_tty_cleanup,
 811	.hangup =		gb_tty_hangup,
 812	.write =		gb_tty_write,
 813	.write_room =		gb_tty_write_room,
 814	.ioctl =		gb_tty_ioctl,
 815	.throttle =		gb_tty_throttle,
 816	.unthrottle =		gb_tty_unthrottle,
 817	.chars_in_buffer =	gb_tty_chars_in_buffer,
 818	.break_ctl =		gb_tty_break_ctl,
 819	.set_termios =		gb_tty_set_termios,
 820	.tiocmget =		gb_tty_tiocmget,
 821	.tiocmset =		gb_tty_tiocmset,
 822	.get_icount =		gb_tty_get_icount,
 823};
 824
 825static const struct tty_port_operations gb_port_ops = {
 826	.dtr_rts =		gb_tty_dtr_rts,
 827	.activate =		gb_tty_port_activate,
 828	.shutdown =		gb_tty_port_shutdown,
 829};
 830
 831static int gb_uart_probe(struct gbphy_device *gbphy_dev,
 832			 const struct gbphy_device_id *id)
 833{
 834	struct gb_connection *connection;
 835	size_t max_payload;
 836	struct gb_tty *gb_tty;
 837	struct device *tty_dev;
 838	int retval;
 839	int minor;
 840
 841	gb_tty = kzalloc(sizeof(*gb_tty), GFP_KERNEL);
 842	if (!gb_tty)
 843		return -ENOMEM;
 844
 845	connection = gb_connection_create(gbphy_dev->bundle,
 846					  le16_to_cpu(gbphy_dev->cport_desc->id),
 847					  gb_uart_request_handler);
 848	if (IS_ERR(connection)) {
 849		retval = PTR_ERR(connection);
 850		goto exit_tty_free;
 851	}
 852
 853	max_payload = gb_operation_get_payload_size_max(connection);
 854	if (max_payload < sizeof(struct gb_uart_send_data_request)) {
 855		retval = -EINVAL;
 856		goto exit_connection_destroy;
 857	}
 858
 859	gb_tty->buffer_payload_max = max_payload -
 860			sizeof(struct gb_uart_send_data_request);
 861
 862	gb_tty->buffer = kzalloc(gb_tty->buffer_payload_max, GFP_KERNEL);
 863	if (!gb_tty->buffer) {
 864		retval = -ENOMEM;
 865		goto exit_connection_destroy;
 866	}
 867
 868	INIT_WORK(&gb_tty->tx_work, gb_uart_tx_write_work);
 869
 870	retval = kfifo_alloc(&gb_tty->write_fifo, GB_UART_WRITE_FIFO_SIZE,
 871			     GFP_KERNEL);
 872	if (retval)
 873		goto exit_buf_free;
 874
 875	gb_tty->credits = GB_UART_FIRMWARE_CREDITS;
 876	init_completion(&gb_tty->credits_complete);
 877
 878	minor = alloc_minor(gb_tty);
 879	if (minor < 0) {
 880		if (minor == -ENOSPC) {
 881			dev_err(&gbphy_dev->dev,
 882				"no more free minor numbers\n");
 883			retval = -ENODEV;
 884		} else {
 885			retval = minor;
 886		}
 887		goto exit_kfifo_free;
 888	}
 889
 890	gb_tty->minor = minor;
 891	spin_lock_init(&gb_tty->write_lock);
 892	spin_lock_init(&gb_tty->read_lock);
 893	init_waitqueue_head(&gb_tty->wioctl);
 894	mutex_init(&gb_tty->mutex);
 895
 896	tty_port_init(&gb_tty->port);
 897	gb_tty->port.ops = &gb_port_ops;
 898
 899	gb_tty->connection = connection;
 900	gb_tty->gbphy_dev = gbphy_dev;
 901	gb_connection_set_data(connection, gb_tty);
 902	gb_gbphy_set_data(gbphy_dev, gb_tty);
 903
 904	retval = gb_connection_enable_tx(connection);
 905	if (retval)
 906		goto exit_release_minor;
 907
 908	send_control(gb_tty, gb_tty->ctrlout);
 909
 910	/* initialize the uart to be 9600n81 */
 911	gb_tty->line_coding.rate = cpu_to_le32(9600);
 912	gb_tty->line_coding.format = GB_SERIAL_1_STOP_BITS;
 913	gb_tty->line_coding.parity = GB_SERIAL_NO_PARITY;
 914	gb_tty->line_coding.data_bits = 8;
 915	send_line_coding(gb_tty);
 916
 917	retval = gb_connection_enable(connection);
 918	if (retval)
 919		goto exit_connection_disable;
 920
 921	tty_dev = tty_port_register_device(&gb_tty->port, gb_tty_driver, minor,
 922					   &gbphy_dev->dev);
 923	if (IS_ERR(tty_dev)) {
 924		retval = PTR_ERR(tty_dev);
 925		goto exit_connection_disable;
 926	}
 927
 928	gbphy_runtime_put_autosuspend(gbphy_dev);
 929	return 0;
 930
 931exit_connection_disable:
 932	gb_connection_disable(connection);
 933exit_release_minor:
 934	release_minor(gb_tty);
 935exit_kfifo_free:
 936	kfifo_free(&gb_tty->write_fifo);
 937exit_buf_free:
 938	kfree(gb_tty->buffer);
 939exit_connection_destroy:
 940	gb_connection_destroy(connection);
 941exit_tty_free:
 942	kfree(gb_tty);
 943
 944	return retval;
 945}
 946
 947static void gb_uart_remove(struct gbphy_device *gbphy_dev)
 948{
 949	struct gb_tty *gb_tty = gb_gbphy_get_data(gbphy_dev);
 950	struct gb_connection *connection = gb_tty->connection;
 951	struct tty_struct *tty;
 952	int ret;
 953
 954	ret = gbphy_runtime_get_sync(gbphy_dev);
 955	if (ret)
 956		gbphy_runtime_get_noresume(gbphy_dev);
 957
 958	mutex_lock(&gb_tty->mutex);
 959	gb_tty->disconnected = true;
 960
 961	wake_up_all(&gb_tty->wioctl);
 962	mutex_unlock(&gb_tty->mutex);
 963
 964	tty = tty_port_tty_get(&gb_tty->port);
 965	if (tty) {
 966		tty_vhangup(tty);
 967		tty_kref_put(tty);
 968	}
 969
 970	gb_connection_disable_rx(connection);
 971	tty_unregister_device(gb_tty_driver, gb_tty->minor);
 972
 973	/* FIXME - free transmit / receive buffers */
 974
 975	gb_connection_disable(connection);
 976	tty_port_destroy(&gb_tty->port);
 977	gb_connection_destroy(connection);
 978	release_minor(gb_tty);
 979	kfifo_free(&gb_tty->write_fifo);
 980	kfree(gb_tty->buffer);
 981	kfree(gb_tty);
 982}
 983
 984static int gb_tty_init(void)
 985{
 986	int retval = 0;
 987
 988	gb_tty_driver = tty_alloc_driver(GB_NUM_MINORS, 0);
 989	if (IS_ERR(gb_tty_driver)) {
 990		pr_err("Can not allocate tty driver\n");
 991		retval = -ENOMEM;
 992		goto fail_unregister_dev;
 993	}
 994
 995	gb_tty_driver->driver_name = "gb";
 996	gb_tty_driver->name = GB_NAME;
 997	gb_tty_driver->major = 0;
 998	gb_tty_driver->minor_start = 0;
 999	gb_tty_driver->type = TTY_DRIVER_TYPE_SERIAL;
1000	gb_tty_driver->subtype = SERIAL_TYPE_NORMAL;
1001	gb_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
1002	gb_tty_driver->init_termios = tty_std_termios;
1003	gb_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
1004	tty_set_operations(gb_tty_driver, &gb_ops);
1005
1006	retval = tty_register_driver(gb_tty_driver);
1007	if (retval) {
1008		pr_err("Can not register tty driver: %d\n", retval);
1009		goto fail_put_gb_tty;
1010	}
1011
1012	return 0;
1013
1014fail_put_gb_tty:
1015	put_tty_driver(gb_tty_driver);
1016fail_unregister_dev:
1017	return retval;
1018}
1019
1020static void gb_tty_exit(void)
1021{
1022	tty_unregister_driver(gb_tty_driver);
1023	put_tty_driver(gb_tty_driver);
1024	idr_destroy(&tty_minors);
1025}
1026
1027static const struct gbphy_device_id gb_uart_id_table[] = {
1028	{ GBPHY_PROTOCOL(GREYBUS_PROTOCOL_UART) },
1029	{ },
1030};
1031MODULE_DEVICE_TABLE(gbphy, gb_uart_id_table);
1032
1033static struct gbphy_driver uart_driver = {
1034	.name		= "uart",
1035	.probe		= gb_uart_probe,
1036	.remove		= gb_uart_remove,
1037	.id_table	= gb_uart_id_table,
1038};
1039
1040static int gb_uart_driver_init(void)
1041{
1042	int ret;
1043
1044	ret = gb_tty_init();
1045	if (ret)
1046		return ret;
1047
1048	ret = gb_gbphy_register(&uart_driver);
1049	if (ret) {
1050		gb_tty_exit();
1051		return ret;
1052	}
1053
1054	return 0;
1055}
1056module_init(gb_uart_driver_init);
1057
1058static void gb_uart_driver_exit(void)
1059{
1060	gb_gbphy_deregister(&uart_driver);
1061	gb_tty_exit();
1062}
1063
1064module_exit(gb_uart_driver_exit);
1065MODULE_LICENSE("GPL v2");