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