11bb92983SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */ 2974c85b1SJens Wiklander /* 3974c85b1SJens Wiklander * Copyright (c) 2016, Linaro Limited 4974c85b1SJens Wiklander */ 5974c85b1SJens Wiklander #ifndef __DRIVERS_SERIAL_H 6974c85b1SJens Wiklander #define __DRIVERS_SERIAL_H 7974c85b1SJens Wiklander 8a26e2529SJerome Forissier #include <assert.h> 9ae8a86d9SJerome Forissier #include <stdbool.h> 10a26e2529SJerome Forissier #include <types_ext.h> 11a26e2529SJerome Forissier #include <mm/core_memprot.h> 12a26e2529SJerome Forissier #include <mm/core_mmu.h> 13ae8a86d9SJerome Forissier 14974c85b1SJens Wiklander struct serial_chip { 15974c85b1SJens Wiklander const struct serial_ops *ops; 16974c85b1SJens Wiklander }; 17974c85b1SJens Wiklander 18974c85b1SJens Wiklander struct serial_ops { 197b84e23dSJerome Forissier /* Mandatory handler */ 20974c85b1SJens Wiklander void (*putc)(struct serial_chip *chip, int ch); 217b84e23dSJerome Forissier /* Optional handlers */ 22974c85b1SJens Wiklander void (*flush)(struct serial_chip *chip); 23974c85b1SJens Wiklander bool (*have_rx_data)(struct serial_chip *chip); 24974c85b1SJens Wiklander int (*getchar)(struct serial_chip *chip); 25*e934bfa4SJens Wiklander void (*rx_intr_enable)(struct serial_chip *chip); 26*e934bfa4SJens Wiklander void (*rx_intr_disable)(struct serial_chip *chip); 27974c85b1SJens Wiklander }; 28974c85b1SJens Wiklander 299e30051eSJerome Forissier struct serial_driver { 309e30051eSJerome Forissier /* Allocate device data and return the inner serial_chip */ 319e30051eSJerome Forissier struct serial_chip *(*dev_alloc)(void); 329e30051eSJerome Forissier /* 339e30051eSJerome Forissier * Initialize device from FDT node. @parms is device-specific, 349e30051eSJerome Forissier * its meaning is as defined by the DT bindings for the characters 359e30051eSJerome Forissier * following the ":" in /chosen/stdout-path. Typically for UART 369e30051eSJerome Forissier * devices this is <baud>{<parity>{<bits>{<flow>}}} where: 379e30051eSJerome Forissier * baud - baud rate in decimal 389e30051eSJerome Forissier * parity - 'n' (none), 'o', (odd) or 'e' (even) 399e30051eSJerome Forissier * bits - number of data bits 409e30051eSJerome Forissier * flow - 'r' (rts) 419e30051eSJerome Forissier * For example: 115200n8r 429e30051eSJerome Forissier */ 439e30051eSJerome Forissier int (*dev_init)(struct serial_chip *dev, const void *fdt, 449e30051eSJerome Forissier int offset, const char *parms); 459e30051eSJerome Forissier void (*dev_free)(struct serial_chip *dev); 469e30051eSJerome Forissier }; 479e30051eSJerome Forissier 48974c85b1SJens Wiklander #endif /*__DRIVERS_SERIASERIAL_H*/ 49