Lines Matching refs:bc

90 static void enable_tx_interrupt(struct ehv_bc_data *bc)  in enable_tx_interrupt()  argument
92 if (!bc->tx_irq_enabled) { in enable_tx_interrupt()
93 enable_irq(bc->tx_irq); in enable_tx_interrupt()
94 bc->tx_irq_enabled = 1; in enable_tx_interrupt()
98 static void disable_tx_interrupt(struct ehv_bc_data *bc) in disable_tx_interrupt() argument
100 if (bc->tx_irq_enabled) { in disable_tx_interrupt()
101 disable_irq_nosync(bc->tx_irq); in disable_tx_interrupt()
102 bc->tx_irq_enabled = 0; in disable_tx_interrupt()
338 struct ehv_bc_data *bc = data; in ehv_bc_tty_rx_isr() local
348 ev_byte_channel_poll(bc->handle, &rx_count, &tx_count); in ehv_bc_tty_rx_isr()
349 count = tty_buffer_request_room(&bc->port, rx_count); in ehv_bc_tty_rx_isr()
363 ev_byte_channel_receive(bc->handle, &len, buffer); in ehv_bc_tty_rx_isr()
370 ret = tty_insert_flip_string(&bc->port, buffer, len); in ehv_bc_tty_rx_isr()
385 tty_flip_buffer_push(&bc->port); in ehv_bc_tty_rx_isr()
396 static void ehv_bc_tx_dequeue(struct ehv_bc_data *bc) in ehv_bc_tx_dequeue() argument
403 spin_lock_irqsave(&bc->lock, flags); in ehv_bc_tx_dequeue()
405 CIRC_CNT_TO_END(bc->head, bc->tail, BUF_SIZE), in ehv_bc_tx_dequeue()
408 ret = ev_byte_channel_send(bc->handle, &len, bc->buf + bc->tail); in ehv_bc_tx_dequeue()
412 bc->tail = (bc->tail + len) & (BUF_SIZE - 1); in ehv_bc_tx_dequeue()
414 count = CIRC_CNT(bc->head, bc->tail, BUF_SIZE); in ehv_bc_tx_dequeue()
415 spin_unlock_irqrestore(&bc->lock, flags); in ehv_bc_tx_dequeue()
418 spin_lock_irqsave(&bc->lock, flags); in ehv_bc_tx_dequeue()
419 if (CIRC_CNT(bc->head, bc->tail, BUF_SIZE)) in ehv_bc_tx_dequeue()
425 enable_tx_interrupt(bc); in ehv_bc_tx_dequeue()
427 disable_tx_interrupt(bc); in ehv_bc_tx_dequeue()
428 spin_unlock_irqrestore(&bc->lock, flags); in ehv_bc_tx_dequeue()
439 struct ehv_bc_data *bc = data; in ehv_bc_tty_tx_isr() local
441 ehv_bc_tx_dequeue(bc); in ehv_bc_tty_tx_isr()
442 tty_port_tty_wakeup(&bc->port); in ehv_bc_tty_tx_isr()
461 struct ehv_bc_data *bc = ttys->driver_data; in ehv_bc_tty_write() local
467 spin_lock_irqsave(&bc->lock, flags); in ehv_bc_tty_write()
468 len = CIRC_SPACE_TO_END(bc->head, bc->tail, BUF_SIZE); in ehv_bc_tty_write()
472 memcpy(bc->buf + bc->head, s, len); in ehv_bc_tty_write()
473 bc->head = (bc->head + len) & (BUF_SIZE - 1); in ehv_bc_tty_write()
475 spin_unlock_irqrestore(&bc->lock, flags); in ehv_bc_tty_write()
484 ehv_bc_tx_dequeue(bc); in ehv_bc_tty_write()
500 struct ehv_bc_data *bc = &bcs[ttys->index]; in ehv_bc_tty_open() local
502 if (!bc->dev) in ehv_bc_tty_open()
505 return tty_port_open(&bc->port, ttys, filp); in ehv_bc_tty_open()
515 struct ehv_bc_data *bc = &bcs[ttys->index]; in ehv_bc_tty_close() local
517 if (bc->dev) in ehv_bc_tty_close()
518 tty_port_close(&bc->port, ttys, filp); in ehv_bc_tty_close()
530 struct ehv_bc_data *bc = ttys->driver_data; in ehv_bc_tty_write_room() local
534 spin_lock_irqsave(&bc->lock, flags); in ehv_bc_tty_write_room()
535 count = CIRC_SPACE(bc->head, bc->tail, BUF_SIZE); in ehv_bc_tty_write_room()
536 spin_unlock_irqrestore(&bc->lock, flags); in ehv_bc_tty_write_room()
555 struct ehv_bc_data *bc = ttys->driver_data; in ehv_bc_tty_throttle() local
557 disable_irq(bc->rx_irq); in ehv_bc_tty_throttle()
569 struct ehv_bc_data *bc = ttys->driver_data; in ehv_bc_tty_unthrottle() local
574 enable_irq(bc->rx_irq); in ehv_bc_tty_unthrottle()
579 struct ehv_bc_data *bc = ttys->driver_data; in ehv_bc_tty_hangup() local
581 ehv_bc_tx_dequeue(bc); in ehv_bc_tty_hangup()
582 tty_port_hangup(&bc->port); in ehv_bc_tty_hangup()
612 struct ehv_bc_data *bc = container_of(port, struct ehv_bc_data, port); in ehv_bc_tty_port_activate() local
615 ttys->driver_data = bc; in ehv_bc_tty_port_activate()
617 ret = request_irq(bc->rx_irq, ehv_bc_tty_rx_isr, 0, "ehv-bc", bc); in ehv_bc_tty_port_activate()
619 dev_err(bc->dev, "could not request rx irq %u (ret=%i)\n", in ehv_bc_tty_port_activate()
620 bc->rx_irq, ret); in ehv_bc_tty_port_activate()
625 bc->tx_irq_enabled = 1; in ehv_bc_tty_port_activate()
627 ret = request_irq(bc->tx_irq, ehv_bc_tty_tx_isr, 0, "ehv-bc", bc); in ehv_bc_tty_port_activate()
629 dev_err(bc->dev, "could not request tx irq %u (ret=%i)\n", in ehv_bc_tty_port_activate()
630 bc->tx_irq, ret); in ehv_bc_tty_port_activate()
631 free_irq(bc->rx_irq, bc); in ehv_bc_tty_port_activate()
638 disable_tx_interrupt(bc); in ehv_bc_tty_port_activate()
645 struct ehv_bc_data *bc = container_of(port, struct ehv_bc_data, port); in ehv_bc_tty_port_shutdown() local
647 free_irq(bc->tx_irq, bc); in ehv_bc_tty_port_shutdown()
648 free_irq(bc->rx_irq, bc); in ehv_bc_tty_port_shutdown()
659 struct ehv_bc_data *bc; in ehv_bc_tty_probe() local
679 bc = &bcs[i]; in ehv_bc_tty_probe()
681 bc->handle = handle; in ehv_bc_tty_probe()
682 bc->head = 0; in ehv_bc_tty_probe()
683 bc->tail = 0; in ehv_bc_tty_probe()
684 spin_lock_init(&bc->lock); in ehv_bc_tty_probe()
686 bc->rx_irq = irq_of_parse_and_map(np, 0); in ehv_bc_tty_probe()
687 bc->tx_irq = irq_of_parse_and_map(np, 1); in ehv_bc_tty_probe()
688 if ((bc->rx_irq == NO_IRQ) || (bc->tx_irq == NO_IRQ)) { in ehv_bc_tty_probe()
695 tty_port_init(&bc->port); in ehv_bc_tty_probe()
696 bc->port.ops = &ehv_bc_tty_port_ops; in ehv_bc_tty_probe()
698 bc->dev = tty_port_register_device(&bc->port, ehv_bc_driver, i, in ehv_bc_tty_probe()
700 if (IS_ERR(bc->dev)) { in ehv_bc_tty_probe()
701 ret = PTR_ERR(bc->dev); in ehv_bc_tty_probe()
706 dev_set_drvdata(&pdev->dev, bc); in ehv_bc_tty_probe()
709 ehv_bc_driver->name, i, bc->handle); in ehv_bc_tty_probe()
714 tty_port_destroy(&bc->port); in ehv_bc_tty_probe()
715 irq_dispose_mapping(bc->tx_irq); in ehv_bc_tty_probe()
716 irq_dispose_mapping(bc->rx_irq); in ehv_bc_tty_probe()
718 memset(bc, 0, sizeof(struct ehv_bc_data)); in ehv_bc_tty_probe()
724 struct ehv_bc_data *bc = dev_get_drvdata(&pdev->dev); in ehv_bc_tty_remove() local
726 tty_unregister_device(ehv_bc_driver, bc - bcs); in ehv_bc_tty_remove()
728 tty_port_destroy(&bc->port); in ehv_bc_tty_remove()
729 irq_dispose_mapping(bc->tx_irq); in ehv_bc_tty_remove()
730 irq_dispose_mapping(bc->rx_irq); in ehv_bc_tty_remove()