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 293fb85889SMatthias Fuchs #if defined(CONFIG_405GP) || \ 30a6e6f7f4SGerlando Falauto defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \ 31a6e6f7f4SGerlando Falauto defined(CONFIG_405EX) || defined(CONFIG_440) || \ 326052ac83SMatthias Weisser defined(CONFIG_MB86R0x) || defined(CONFIG_MPC5xxx) || \ 336052ac83SMatthias Weisser defined(CONFIG_MPC83xx) || defined(CONFIG_MPC85xx) || \ 342ee36781STom Warren defined(CONFIG_MPC86xx) || defined(CONFIG_SYS_SC520) || \ 356d6c0baeSTom Warren defined(CONFIG_TEGRA) || defined(CONFIG_SYS_COREBOOT) || \ 367636ebe1SMichal Simek defined(CONFIG_MICROBLAZE) 37ff36fd85Swdenk extern struct serial_device serial0_device; 38ff36fd85Swdenk extern struct serial_device serial1_device; 39abc0ed8dSMarek Vasut #endif 40abc0ed8dSMarek Vasut 410fd30252SWolfgang Denk extern struct serial_device eserial1_device; 420fd30252SWolfgang Denk extern struct serial_device eserial2_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 68036036d7SMarek Vasut #if defined(CONFIG_MPC512X) 698e234e33SAnatolij Gustschin extern struct stdio_dev *open_port(int num, int baudrate); 708e234e33SAnatolij Gustschin extern int close_port(int num); 718e234e33SAnatolij Gustschin extern int write_port(struct stdio_dev *port, char *buf); 728e234e33SAnatolij Gustschin extern int read_port(struct stdio_dev *port, char *buf, int size); 738e234e33SAnatolij Gustschin #endif 748e234e33SAnatolij Gustschin 75*57d92753SSimon Glass struct udevice; 76*57d92753SSimon Glass 77*57d92753SSimon Glass /** 78*57d92753SSimon Glass * struct struct dm_serial_ops - Driver model serial operations 79*57d92753SSimon Glass * 80*57d92753SSimon Glass * The uclass interface is implemented by all serial devices which use 81*57d92753SSimon Glass * driver model. 82*57d92753SSimon Glass */ 83*57d92753SSimon Glass struct dm_serial_ops { 84*57d92753SSimon Glass /** 85*57d92753SSimon Glass * setbrg() - Set up the baud rate generator 86*57d92753SSimon Glass * 87*57d92753SSimon Glass * Adjust baud rate divisors to set up a new baud rate for this 88*57d92753SSimon Glass * device. Not all devices will support all rates. If the rate 89*57d92753SSimon Glass * cannot be supported, the driver is free to select the nearest 90*57d92753SSimon Glass * available rate. or return -EINVAL if this is not possible. 91*57d92753SSimon Glass * 92*57d92753SSimon Glass * @dev: Device pointer 93*57d92753SSimon Glass * @baudrate: New baud rate to use 94*57d92753SSimon Glass * @return 0 if OK, -ve on error 95*57d92753SSimon Glass */ 96*57d92753SSimon Glass int (*setbrg)(struct udevice *dev, int baudrate); 97*57d92753SSimon Glass /** 98*57d92753SSimon Glass * getc() - Read a character and return it 99*57d92753SSimon Glass * 100*57d92753SSimon Glass * If no character is available, this should return -EAGAIN without 101*57d92753SSimon Glass * waiting. 102*57d92753SSimon Glass * 103*57d92753SSimon Glass * @dev: Device pointer 104*57d92753SSimon Glass * @return character (0..255), -ve on error 105*57d92753SSimon Glass */ 106*57d92753SSimon Glass int (*getc)(struct udevice *dev); 107*57d92753SSimon Glass /** 108*57d92753SSimon Glass * putc() - Write a character 109*57d92753SSimon Glass * 110*57d92753SSimon Glass * @dev: Device pointer 111*57d92753SSimon Glass * @ch: character to write 112*57d92753SSimon Glass * @return 0 if OK, -ve on error 113*57d92753SSimon Glass */ 114*57d92753SSimon Glass int (*putc)(struct udevice *dev, const char ch); 115*57d92753SSimon Glass /** 116*57d92753SSimon Glass * pending() - Check if input/output characters are waiting 117*57d92753SSimon Glass * 118*57d92753SSimon Glass * This can be used to return an indication of the number of waiting 119*57d92753SSimon Glass * characters if the driver knows this (e.g. by looking at the FIFO 120*57d92753SSimon Glass * level). It is acceptable to return 1 if an indeterminant number 121*57d92753SSimon Glass * of characters is waiting. 122*57d92753SSimon Glass * 123*57d92753SSimon Glass * This method is optional. 124*57d92753SSimon Glass * 125*57d92753SSimon Glass * @dev: Device pointer 126*57d92753SSimon Glass * @input: true to check input characters, false for output 127*57d92753SSimon Glass * @return number of waiting characters, 0 for none, -ve on error 128*57d92753SSimon Glass */ 129*57d92753SSimon Glass int (*pending)(struct udevice *dev, bool input); 130*57d92753SSimon Glass /** 131*57d92753SSimon Glass * clear() - Clear the serial FIFOs/holding registers 132*57d92753SSimon Glass * 133*57d92753SSimon Glass * This method is optional. 134*57d92753SSimon Glass * 135*57d92753SSimon Glass * This quickly clears any input/output characters from the UART. 136*57d92753SSimon Glass * If this is not possible, but characters still exist, then it 137*57d92753SSimon Glass * is acceptable to return -EAGAIN (try again) or -EINVAL (not 138*57d92753SSimon Glass * supported). 139*57d92753SSimon Glass * 140*57d92753SSimon Glass * @dev: Device pointer 141*57d92753SSimon Glass * @return 0 if OK, -ve on error 142*57d92753SSimon Glass */ 143*57d92753SSimon Glass int (*clear)(struct udevice *dev); 144*57d92753SSimon Glass #if CONFIG_POST & CONFIG_SYS_POST_UART 145*57d92753SSimon Glass /** 146*57d92753SSimon Glass * loop() - Control serial device loopback mode 147*57d92753SSimon Glass * 148*57d92753SSimon Glass * @dev: Device pointer 149*57d92753SSimon Glass * @on: 1 to turn loopback on, 0 to turn if off 150*57d92753SSimon Glass */ 151*57d92753SSimon Glass int (*loop)(struct udevice *dev, int on); 152*57d92753SSimon Glass #endif 153*57d92753SSimon Glass }; 154*57d92753SSimon Glass 155*57d92753SSimon Glass /** 156*57d92753SSimon Glass * struct serial_dev_priv - information about a device used by the uclass 157*57d92753SSimon Glass * 158*57d92753SSimon Glass * @sdev: stdio device attached to this uart 159*57d92753SSimon Glass */ 160*57d92753SSimon Glass struct serial_dev_priv { 161*57d92753SSimon Glass struct stdio_dev *sdev; 162*57d92753SSimon Glass }; 163*57d92753SSimon Glass 164*57d92753SSimon Glass /* Access the serial operations for a device */ 165*57d92753SSimon Glass #define serial_get_ops(dev) ((struct dm_serial_ops *)(dev)->driver->ops) 166*57d92753SSimon Glass 167281e00a3Swdenk #endif 168