static u32 imx_read(struct vmm_chardev *cdev, u8 *dest, size_t len, off_t __unused *off, bool sleep) { u32 i; struct imx_port *port; if (!(cdev && dest && cdev->priv)) { return 0; } port = cdev->priv; if (sleep) { for (i = 0; i < len; i++) { dest[i] = imx_getc_sleepable(port); } } else { for (i = 0; i < len; i++) { if (!imx_lowlevel_can_getc(port->base)) { break; } dest[i] = imx_lowlevel_getc(port->base); } } return i; }
static void imx_rxint(struct imx_port *port) { while (imx_lowlevel_can_getc(port->base)) { u8 ch = imx_lowlevel_getc(port->base); serial_rx(port->p, &ch, 1); } }
static int imx_defterm_getc(u8 *ch) { if (!imx_lowlevel_can_getc(imx_defterm_base)) { return VMM_EFAIL; } *ch = imx_lowlevel_getc(imx_defterm_base); return VMM_OK; }
static u8 imx_getc_sleepable(struct imx_port *port) { /* Wait until there is data in the FIFO */ while (!imx_lowlevel_can_getc(port->base)) { /* Enable the RX interrupt */ port->mask |= UCR1_RRDYEN; vmm_writel(port->mask, (void *)port->base + UCR1); /* Wait for completion */ vmm_completion_wait(&port->read_possible); } /* Read data to destination */ return imx_lowlevel_getc(port->base); }