1281e00a3Swdenk #ifndef __SERIAL_H__ 2281e00a3Swdenk #define __SERIAL_H__ 3281e00a3Swdenk 47b826c2fSMike Frysinger #include <post.h> 57b826c2fSMike Frysinger 6281e00a3Swdenk struct serial_device { 7f6add132SMike Frysinger /* enough bytes to match alignment of following func pointer */ 8f6add132SMike Frysinger char name[16]; 9281e00a3Swdenk 1089143fb3SMarek Vasut int (*start)(void); 1189143fb3SMarek Vasut int (*stop)(void); 12281e00a3Swdenk void (*setbrg)(void); 13281e00a3Swdenk int (*getc)(void); 14281e00a3Swdenk int (*tstc)(void); 15281e00a3Swdenk void (*putc)(const char c); 16281e00a3Swdenk void (*puts)(const char *s); 177b826c2fSMike Frysinger #if CONFIG_POST & CONFIG_SYS_POST_UART 187b826c2fSMike Frysinger void (*loop)(int); 197b826c2fSMike Frysinger #endif 20281e00a3Swdenk struct serial_device *next; 21281e00a3Swdenk }; 22281e00a3Swdenk 23bfb7d7a3SMarek Vasut void default_serial_puts(const char *s); 24bfb7d7a3SMarek Vasut 25281e00a3Swdenk extern struct serial_device serial_smc_device; 26281e00a3Swdenk extern struct serial_device serial_scc_device; 27281e00a3Swdenk extern struct serial_device *default_serial_console(void); 28281e00a3Swdenk 2998f705c9SHeiko Schocher #if defined(CONFIG_MPC83xx) || defined(CONFIG_MPC85xx) || \ 30064b55cfSHeiko Schocher defined(CONFIG_MPC86xx) || \ 316d6c0baeSTom Warren defined(CONFIG_TEGRA) || defined(CONFIG_SYS_COREBOOT) || \ 327636ebe1SMichal Simek defined(CONFIG_MICROBLAZE) 33ff36fd85Swdenk extern struct serial_device serial0_device; 34ff36fd85Swdenk extern struct serial_device serial1_device; 35abc0ed8dSMarek Vasut #endif 36abc0ed8dSMarek Vasut 370fd30252SWolfgang Denk extern struct serial_device eserial1_device; 380fd30252SWolfgang Denk extern struct serial_device eserial2_device; 393d16389cSLokesh Vutla extern struct serial_device eserial3_device; 403d16389cSLokesh Vutla extern struct serial_device eserial4_device; 413d16389cSLokesh Vutla extern struct serial_device eserial5_device; 423d16389cSLokesh Vutla extern struct serial_device eserial6_device; 43ff36fd85Swdenk 44635f330fSMike Frysinger extern void serial_register(struct serial_device *); 45281e00a3Swdenk extern void serial_initialize(void); 4652cb4d4fSJean-Christophe PLAGNIOL-VILLARD extern void serial_stdio_init(void); 477813ca9bSGerlando Falauto extern int serial_assign(const char *name); 48281e00a3Swdenk extern void serial_reinit_all(void); 49281e00a3Swdenk 506299487eSTom Rix /* For usbtty */ 512ec1abeaSTom Rix #ifdef CONFIG_USB_TTY 522ec1abeaSTom Rix 536299487eSTom Rix extern int usbtty_getc(void); 546299487eSTom Rix extern void usbtty_putc(const char c); 556299487eSTom Rix extern void usbtty_puts(const char *str); 566299487eSTom Rix extern int usbtty_tstc(void); 576299487eSTom Rix 582ec1abeaSTom Rix #else 592ec1abeaSTom Rix 602ec1abeaSTom Rix /* stubs */ 612ec1abeaSTom Rix #define usbtty_getc() 0 622ec1abeaSTom Rix #define usbtty_putc(a) 632ec1abeaSTom Rix #define usbtty_puts(a) 642ec1abeaSTom Rix #define usbtty_tstc() 0 652ec1abeaSTom Rix 662ec1abeaSTom Rix #endif /* CONFIG_USB_TTY */ 672ec1abeaSTom Rix 6857d92753SSimon Glass struct udevice; 6957d92753SSimon Glass 7057d92753SSimon Glass /** 7157d92753SSimon Glass * struct struct dm_serial_ops - Driver model serial operations 7257d92753SSimon Glass * 7357d92753SSimon Glass * The uclass interface is implemented by all serial devices which use 7457d92753SSimon Glass * driver model. 7557d92753SSimon Glass */ 7657d92753SSimon Glass struct dm_serial_ops { 7757d92753SSimon Glass /** 7857d92753SSimon Glass * setbrg() - Set up the baud rate generator 7957d92753SSimon Glass * 8057d92753SSimon Glass * Adjust baud rate divisors to set up a new baud rate for this 8157d92753SSimon Glass * device. Not all devices will support all rates. If the rate 8257d92753SSimon Glass * cannot be supported, the driver is free to select the nearest 8357d92753SSimon Glass * available rate. or return -EINVAL if this is not possible. 8457d92753SSimon Glass * 8557d92753SSimon Glass * @dev: Device pointer 8657d92753SSimon Glass * @baudrate: New baud rate to use 8757d92753SSimon Glass * @return 0 if OK, -ve on error 8857d92753SSimon Glass */ 8957d92753SSimon Glass int (*setbrg)(struct udevice *dev, int baudrate); 9057d92753SSimon Glass /** 9157d92753SSimon Glass * getc() - Read a character and return it 9257d92753SSimon Glass * 9357d92753SSimon Glass * If no character is available, this should return -EAGAIN without 9457d92753SSimon Glass * waiting. 9557d92753SSimon Glass * 9657d92753SSimon Glass * @dev: Device pointer 9757d92753SSimon Glass * @return character (0..255), -ve on error 9857d92753SSimon Glass */ 9957d92753SSimon Glass int (*getc)(struct udevice *dev); 10057d92753SSimon Glass /** 10157d92753SSimon Glass * putc() - Write a character 10257d92753SSimon Glass * 10357d92753SSimon Glass * @dev: Device pointer 10457d92753SSimon Glass * @ch: character to write 10557d92753SSimon Glass * @return 0 if OK, -ve on error 10657d92753SSimon Glass */ 10757d92753SSimon Glass int (*putc)(struct udevice *dev, const char ch); 10857d92753SSimon Glass /** 10957d92753SSimon Glass * pending() - Check if input/output characters are waiting 11057d92753SSimon Glass * 11157d92753SSimon Glass * This can be used to return an indication of the number of waiting 11257d92753SSimon Glass * characters if the driver knows this (e.g. by looking at the FIFO 11357d92753SSimon Glass * level). It is acceptable to return 1 if an indeterminant number 11457d92753SSimon Glass * of characters is waiting. 11557d92753SSimon Glass * 11657d92753SSimon Glass * This method is optional. 11757d92753SSimon Glass * 11857d92753SSimon Glass * @dev: Device pointer 11957d92753SSimon Glass * @input: true to check input characters, false for output 12057d92753SSimon Glass * @return number of waiting characters, 0 for none, -ve on error 12157d92753SSimon Glass */ 12257d92753SSimon Glass int (*pending)(struct udevice *dev, bool input); 12357d92753SSimon Glass /** 12457d92753SSimon Glass * clear() - Clear the serial FIFOs/holding registers 12557d92753SSimon Glass * 12657d92753SSimon Glass * This method is optional. 12757d92753SSimon Glass * 12857d92753SSimon Glass * This quickly clears any input/output characters from the UART. 12957d92753SSimon Glass * If this is not possible, but characters still exist, then it 13057d92753SSimon Glass * is acceptable to return -EAGAIN (try again) or -EINVAL (not 13157d92753SSimon Glass * supported). 13257d92753SSimon Glass * 13357d92753SSimon Glass * @dev: Device pointer 13457d92753SSimon Glass * @return 0 if OK, -ve on error 13557d92753SSimon Glass */ 13657d92753SSimon Glass int (*clear)(struct udevice *dev); 13757d92753SSimon Glass #if CONFIG_POST & CONFIG_SYS_POST_UART 13857d92753SSimon Glass /** 13957d92753SSimon Glass * loop() - Control serial device loopback mode 14057d92753SSimon Glass * 14157d92753SSimon Glass * @dev: Device pointer 14257d92753SSimon Glass * @on: 1 to turn loopback on, 0 to turn if off 14357d92753SSimon Glass */ 14457d92753SSimon Glass int (*loop)(struct udevice *dev, int on); 14557d92753SSimon Glass #endif 14657d92753SSimon Glass }; 14757d92753SSimon Glass 14857d92753SSimon Glass /** 14957d92753SSimon Glass * struct serial_dev_priv - information about a device used by the uclass 15057d92753SSimon Glass * 15157d92753SSimon Glass * @sdev: stdio device attached to this uart 152*3ca7a06aSStefan Roese * 153*3ca7a06aSStefan Roese * @buf: Pointer to the RX buffer 154*3ca7a06aSStefan Roese * @rd_ptr: Read pointer in the RX buffer 155*3ca7a06aSStefan Roese * @wr_ptr: Write pointer in the RX buffer 15657d92753SSimon Glass */ 15757d92753SSimon Glass struct serial_dev_priv { 15857d92753SSimon Glass struct stdio_dev *sdev; 159*3ca7a06aSStefan Roese 160*3ca7a06aSStefan Roese char *buf; 161*3ca7a06aSStefan Roese int rd_ptr; 162*3ca7a06aSStefan Roese int wr_ptr; 16357d92753SSimon Glass }; 16457d92753SSimon Glass 16557d92753SSimon Glass /* Access the serial operations for a device */ 16657d92753SSimon Glass #define serial_get_ops(dev) ((struct dm_serial_ops *)(dev)->driver->ops) 16757d92753SSimon Glass 16894a255dfSJeroen Hofstee void amirix_serial_initialize(void); 16994a255dfSJeroen Hofstee void arc_serial_initialize(void); 17094a255dfSJeroen Hofstee void arm_dcc_initialize(void); 17194a255dfSJeroen Hofstee void asc_serial_initialize(void); 17294a255dfSJeroen Hofstee void atmel_serial_initialize(void); 17394a255dfSJeroen Hofstee void au1x00_serial_initialize(void); 17494a255dfSJeroen Hofstee void bfin_jtag_initialize(void); 17594a255dfSJeroen Hofstee void bfin_serial_initialize(void); 17694a255dfSJeroen Hofstee void bmw_serial_initialize(void); 17794a255dfSJeroen Hofstee void clps7111_serial_initialize(void); 17894a255dfSJeroen Hofstee void cogent_serial_initialize(void); 17994a255dfSJeroen Hofstee void cpci750_serial_initialize(void); 18094a255dfSJeroen Hofstee void evb64260_serial_initialize(void); 18194a255dfSJeroen Hofstee void imx_serial_initialize(void); 18294a255dfSJeroen Hofstee void iop480_serial_initialize(void); 18394a255dfSJeroen Hofstee void jz_serial_initialize(void); 18494a255dfSJeroen Hofstee void leon2_serial_initialize(void); 18594a255dfSJeroen Hofstee void leon3_serial_initialize(void); 18694a255dfSJeroen Hofstee void lh7a40x_serial_initialize(void); 18794a255dfSJeroen Hofstee void lpc32xx_serial_initialize(void); 18894a255dfSJeroen Hofstee void marvell_serial_initialize(void); 18994a255dfSJeroen Hofstee void max3100_serial_initialize(void); 19094a255dfSJeroen Hofstee void mcf_serial_initialize(void); 19194a255dfSJeroen Hofstee void ml2_serial_initialize(void); 19294a255dfSJeroen Hofstee void mpc85xx_serial_initialize(void); 19394a255dfSJeroen Hofstee void mpc8xx_serial_initialize(void); 19494a255dfSJeroen Hofstee void mxc_serial_initialize(void); 19594a255dfSJeroen Hofstee void mxs_auart_initialize(void); 19694a255dfSJeroen Hofstee void ns16550_serial_initialize(void); 19794a255dfSJeroen Hofstee void oc_serial_initialize(void); 19894a255dfSJeroen Hofstee void p3mx_serial_initialize(void); 19994a255dfSJeroen Hofstee void pl01x_serial_initialize(void); 20094a255dfSJeroen Hofstee void pxa_serial_initialize(void); 20194a255dfSJeroen Hofstee void s3c24xx_serial_initialize(void); 20294a255dfSJeroen Hofstee void s5p_serial_initialize(void); 20394a255dfSJeroen Hofstee void sa1100_serial_initialize(void); 20494a255dfSJeroen Hofstee void sandbox_serial_initialize(void); 20594a255dfSJeroen Hofstee void sconsole_serial_initialize(void); 20694a255dfSJeroen Hofstee void sh_serial_initialize(void); 20794a255dfSJeroen Hofstee void uartlite_serial_initialize(void); 20894a255dfSJeroen Hofstee void zynq_serial_initialize(void); 20994a255dfSJeroen Hofstee 210281e00a3Swdenk #endif 211