Lines Matching refs:bc
86 static void enable_tx_interrupt(struct ehv_bc_data *bc)
88 if (!bc->tx_irq_enabled) {
89 enable_irq(bc->tx_irq);
90 bc->tx_irq_enabled = 1;
94 static void disable_tx_interrupt(struct ehv_bc_data *bc)
96 if (bc->tx_irq_enabled) {
97 disable_irq_nosync(bc->tx_irq);
98 bc->tx_irq_enabled = 0;
122 pr_err("ehv-bc: no 'interrupts' property in %pOF node\n", np);
131 pr_err("ehv-bc: no 'hv-handle' property in %pOFn node\n",
214 udbg_printf("ehv-bc: early console using byte channel handle %u\n",
313 pr_debug("ehv-bc: stdout is not a byte channel\n");
322 pr_warn("ehv-bc: udbg handle %u is not the stdout handle\n",
333 pr_info("ehv-bc: registered console driver for byte channel %u\n",
349 struct ehv_bc_data *bc = data;
359 ev_byte_channel_poll(bc->handle, &rx_count, &tx_count);
360 count = tty_buffer_request_room(&bc->port, rx_count);
374 ev_byte_channel_receive(bc->handle, &len, buffer);
381 ret = tty_insert_flip_string(&bc->port, buffer, len);
396 tty_flip_buffer_push(&bc->port);
407 static void ehv_bc_tx_dequeue(struct ehv_bc_data *bc)
414 spin_lock_irqsave(&bc->lock, flags);
416 CIRC_CNT_TO_END(bc->head, bc->tail, BUF_SIZE),
419 ret = local_ev_byte_channel_send(bc->handle, &len, bc->buf + bc->tail);
423 bc->tail = (bc->tail + len) & (BUF_SIZE - 1);
425 count = CIRC_CNT(bc->head, bc->tail, BUF_SIZE);
426 spin_unlock_irqrestore(&bc->lock, flags);
429 spin_lock_irqsave(&bc->lock, flags);
430 if (CIRC_CNT(bc->head, bc->tail, BUF_SIZE))
436 enable_tx_interrupt(bc);
438 disable_tx_interrupt(bc);
439 spin_unlock_irqrestore(&bc->lock, flags);
450 struct ehv_bc_data *bc = data;
452 ehv_bc_tx_dequeue(bc);
453 tty_port_tty_wakeup(&bc->port);
472 struct ehv_bc_data *bc = ttys->driver_data;
478 spin_lock_irqsave(&bc->lock, flags);
479 len = CIRC_SPACE_TO_END(bc->head, bc->tail, BUF_SIZE);
483 memcpy(bc->buf + bc->head, s, len);
484 bc->head = (bc->head + len) & (BUF_SIZE - 1);
486 spin_unlock_irqrestore(&bc->lock, flags);
495 ehv_bc_tx_dequeue(bc);
502 * why we initialize bc->ttys in ehv_bc_tty_port_activate() instead.
511 struct ehv_bc_data *bc = &bcs[ttys->index];
513 if (!bc->dev)
516 return tty_port_open(&bc->port, ttys, filp);
526 struct ehv_bc_data *bc = &bcs[ttys->index];
528 if (bc->dev)
529 tty_port_close(&bc->port, ttys, filp);
541 struct ehv_bc_data *bc = ttys->driver_data;
545 spin_lock_irqsave(&bc->lock, flags);
546 count = CIRC_SPACE(bc->head, bc->tail, BUF_SIZE);
547 spin_unlock_irqrestore(&bc->lock, flags);
566 struct ehv_bc_data *bc = ttys->driver_data;
568 disable_irq(bc->rx_irq);
580 struct ehv_bc_data *bc = ttys->driver_data;
585 enable_irq(bc->rx_irq);
590 struct ehv_bc_data *bc = ttys->driver_data;
592 ehv_bc_tx_dequeue(bc);
593 tty_port_hangup(&bc->port);
623 struct ehv_bc_data *bc = container_of(port, struct ehv_bc_data, port);
626 ttys->driver_data = bc;
628 ret = request_irq(bc->rx_irq, ehv_bc_tty_rx_isr, 0, "ehv-bc", bc);
630 dev_err(bc->dev, "could not request rx irq %u (ret=%i)\n",
631 bc->rx_irq, ret);
636 bc->tx_irq_enabled = 1;
638 ret = request_irq(bc->tx_irq, ehv_bc_tty_tx_isr, 0, "ehv-bc", bc);
640 dev_err(bc->dev, "could not request tx irq %u (ret=%i)\n",
641 bc->tx_irq, ret);
642 free_irq(bc->rx_irq, bc);
649 disable_tx_interrupt(bc);
656 struct ehv_bc_data *bc = container_of(port, struct ehv_bc_data, port);
658 free_irq(bc->tx_irq, bc);
659 free_irq(bc->rx_irq, bc);
670 struct ehv_bc_data *bc;
690 bc = &bcs[i];
692 bc->handle = handle;
693 bc->head = 0;
694 bc->tail = 0;
695 spin_lock_init(&bc->lock);
697 bc->rx_irq = irq_of_parse_and_map(np, 0);
698 bc->tx_irq = irq_of_parse_and_map(np, 1);
699 if ((bc->rx_irq == NO_IRQ) || (bc->tx_irq == NO_IRQ)) {
706 tty_port_init(&bc->port);
707 bc->port.ops = &ehv_bc_tty_port_ops;
709 bc->dev = tty_port_register_device(&bc->port, ehv_bc_driver, i,
711 if (IS_ERR(bc->dev)) {
712 ret = PTR_ERR(bc->dev);
717 dev_set_drvdata(&pdev->dev, bc);
720 ehv_bc_driver->name, i, bc->handle);
725 tty_port_destroy(&bc->port);
726 irq_dispose_mapping(bc->tx_irq);
727 irq_dispose_mapping(bc->rx_irq);
729 memset(bc, 0, sizeof(struct ehv_bc_data));
740 .name = "ehv-bc",
769 * array, then you can use pointer math (e.g. "bc - bcs") to get its
782 ehv_bc_driver->driver_name = "ehv-bc";
792 pr_err("ehv-bc: could not register tty driver (ret=%i)\n", ret);
798 pr_err("ehv-bc: could not register platform driver (ret=%i)\n",