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 70eae4764fSPatrick Delaunay enum serial_par { 71eae4764fSPatrick Delaunay SERIAL_PAR_NONE, 72eae4764fSPatrick Delaunay SERIAL_PAR_ODD, 73eae4764fSPatrick Delaunay SERIAL_PAR_EVEN 74eae4764fSPatrick Delaunay }; 75eae4764fSPatrick Delaunay 76cbf53883SPatrice Chotard #define SERIAL_PAR_SHIFT 0 77cbf53883SPatrice Chotard #define SERIAL_PAR_MASK (0x03 << SERIAL_PAR_SHIFT) 78ac7f5db9SAndy Shevchenko #define SERIAL_SET_PARITY(parity) \ 79ac7f5db9SAndy Shevchenko ((parity << SERIAL_PAR_SHIFT) & SERIAL_PAR_MASK) 80cbf53883SPatrice Chotard #define SERIAL_GET_PARITY(config) \ 81cbf53883SPatrice Chotard ((config & SERIAL_PAR_MASK) >> SERIAL_PAR_SHIFT) 82cbf53883SPatrice Chotard 83cbf53883SPatrice Chotard enum serial_bits { 84cbf53883SPatrice Chotard SERIAL_5_BITS, 85cbf53883SPatrice Chotard SERIAL_6_BITS, 86cbf53883SPatrice Chotard SERIAL_7_BITS, 87cbf53883SPatrice Chotard SERIAL_8_BITS 88cbf53883SPatrice Chotard }; 89cbf53883SPatrice Chotard 90cbf53883SPatrice Chotard #define SERIAL_BITS_SHIFT 2 91cbf53883SPatrice Chotard #define SERIAL_BITS_MASK (0x3 << SERIAL_BITS_SHIFT) 92ac7f5db9SAndy Shevchenko #define SERIAL_SET_BITS(bits) \ 93ac7f5db9SAndy Shevchenko ((bits << SERIAL_BITS_SHIFT) & SERIAL_BITS_MASK) 94cbf53883SPatrice Chotard #define SERIAL_GET_BITS(config) \ 95cbf53883SPatrice Chotard ((config & SERIAL_BITS_MASK) >> SERIAL_BITS_SHIFT) 96cbf53883SPatrice Chotard 97cbf53883SPatrice Chotard enum serial_stop { 98cbf53883SPatrice Chotard SERIAL_HALF_STOP, /* 0.5 stop bit */ 99cbf53883SPatrice Chotard SERIAL_ONE_STOP, /* 1 stop bit */ 100cbf53883SPatrice Chotard SERIAL_ONE_HALF_STOP, /* 1.5 stop bit */ 101cbf53883SPatrice Chotard SERIAL_TWO_STOP /* 2 stop bit */ 102cbf53883SPatrice Chotard }; 103cbf53883SPatrice Chotard 104cbf53883SPatrice Chotard #define SERIAL_STOP_SHIFT 4 105cbf53883SPatrice Chotard #define SERIAL_STOP_MASK (0x3 << SERIAL_STOP_SHIFT) 106ac7f5db9SAndy Shevchenko #define SERIAL_SET_STOP(stop) \ 107ac7f5db9SAndy Shevchenko ((stop << SERIAL_STOP_SHIFT) & SERIAL_STOP_MASK) 108cbf53883SPatrice Chotard #define SERIAL_GET_STOP(config) \ 109cbf53883SPatrice Chotard ((config & SERIAL_STOP_MASK) >> SERIAL_STOP_SHIFT) 110cbf53883SPatrice Chotard 111d7c09684SPatrice Chotard #define SERIAL_CONFIG(par, bits, stop) \ 112d7c09684SPatrice Chotard (par << SERIAL_PAR_SHIFT | \ 113d7c09684SPatrice Chotard bits << SERIAL_BITS_SHIFT | \ 114d7c09684SPatrice Chotard stop << SERIAL_STOP_SHIFT) 115d7c09684SPatrice Chotard 116ac7f5db9SAndy Shevchenko #define SERIAL_DEFAULT_CONFIG \ 117ac7f5db9SAndy Shevchenko (SERIAL_PAR_NONE << SERIAL_PAR_SHIFT | \ 118cbf53883SPatrice Chotard SERIAL_8_BITS << SERIAL_BITS_SHIFT | \ 119ac7f5db9SAndy Shevchenko SERIAL_ONE_STOP << SERIAL_STOP_SHIFT) 120cbf53883SPatrice Chotard 121d5bb4f86SAndy Shevchenko enum serial_chip_type { 122d5bb4f86SAndy Shevchenko SERIAL_CHIP_UNKNOWN = -1, 123d5bb4f86SAndy Shevchenko SERIAL_CHIP_16550_COMPATIBLE, 124d5bb4f86SAndy Shevchenko }; 125d5bb4f86SAndy Shevchenko 126d5bb4f86SAndy Shevchenko enum adr_space_type { 127d5bb4f86SAndy Shevchenko SERIAL_ADDRESS_SPACE_MEMORY = 0, 128d5bb4f86SAndy Shevchenko SERIAL_ADDRESS_SPACE_IO, 129d5bb4f86SAndy Shevchenko }; 130d5bb4f86SAndy Shevchenko 131d5bb4f86SAndy Shevchenko /** 132d5bb4f86SAndy Shevchenko * struct serial_device_info - structure to hold serial device info 133d5bb4f86SAndy Shevchenko * 134d5bb4f86SAndy Shevchenko * @type: type of the UART chip 135d5bb4f86SAndy Shevchenko * @addr_space: address space to access the registers 136d5bb4f86SAndy Shevchenko * @addr: physical address of the registers 137d5bb4f86SAndy Shevchenko * @reg_width: size (in bytes) of the IO accesses to the registers 138d5bb4f86SAndy Shevchenko * @reg_offset: offset to apply to the @addr from the start of the registers 139d5bb4f86SAndy Shevchenko * @reg_shift: quantity to shift the register offsets by 140d5bb4f86SAndy Shevchenko * @baudrate: baud rate 141d5bb4f86SAndy Shevchenko */ 142d5bb4f86SAndy Shevchenko struct serial_device_info { 143d5bb4f86SAndy Shevchenko enum serial_chip_type type; 144d5bb4f86SAndy Shevchenko enum adr_space_type addr_space; 145d5bb4f86SAndy Shevchenko ulong addr; 146d5bb4f86SAndy Shevchenko u8 reg_width; 147d5bb4f86SAndy Shevchenko u8 reg_offset; 148d5bb4f86SAndy Shevchenko u8 reg_shift; 149d5bb4f86SAndy Shevchenko unsigned int baudrate; 150d5bb4f86SAndy Shevchenko }; 151d5bb4f86SAndy Shevchenko 152d5bb4f86SAndy Shevchenko #define SERIAL_DEFAULT_ADDRESS 0xBADACCE5 153d5bb4f86SAndy Shevchenko 15457d92753SSimon Glass /** 15557d92753SSimon Glass * struct struct dm_serial_ops - Driver model serial operations 15657d92753SSimon Glass * 15757d92753SSimon Glass * The uclass interface is implemented by all serial devices which use 15857d92753SSimon Glass * driver model. 15957d92753SSimon Glass */ 16057d92753SSimon Glass struct dm_serial_ops { 16157d92753SSimon Glass /** 16257d92753SSimon Glass * setbrg() - Set up the baud rate generator 16357d92753SSimon Glass * 16457d92753SSimon Glass * Adjust baud rate divisors to set up a new baud rate for this 16557d92753SSimon Glass * device. Not all devices will support all rates. If the rate 16657d92753SSimon Glass * cannot be supported, the driver is free to select the nearest 16757d92753SSimon Glass * available rate. or return -EINVAL if this is not possible. 16857d92753SSimon Glass * 16957d92753SSimon Glass * @dev: Device pointer 17057d92753SSimon Glass * @baudrate: New baud rate to use 17157d92753SSimon Glass * @return 0 if OK, -ve on error 17257d92753SSimon Glass */ 17357d92753SSimon Glass int (*setbrg)(struct udevice *dev, int baudrate); 17457d92753SSimon Glass /** 17557d92753SSimon Glass * getc() - Read a character and return it 17657d92753SSimon Glass * 17757d92753SSimon Glass * If no character is available, this should return -EAGAIN without 17857d92753SSimon Glass * waiting. 17957d92753SSimon Glass * 18057d92753SSimon Glass * @dev: Device pointer 18157d92753SSimon Glass * @return character (0..255), -ve on error 18257d92753SSimon Glass */ 18357d92753SSimon Glass int (*getc)(struct udevice *dev); 18457d92753SSimon Glass /** 18557d92753SSimon Glass * putc() - Write a character 18657d92753SSimon Glass * 18757d92753SSimon Glass * @dev: Device pointer 18857d92753SSimon Glass * @ch: character to write 18957d92753SSimon Glass * @return 0 if OK, -ve on error 19057d92753SSimon Glass */ 19157d92753SSimon Glass int (*putc)(struct udevice *dev, const char ch); 19257d92753SSimon Glass /** 19357d92753SSimon Glass * pending() - Check if input/output characters are waiting 19457d92753SSimon Glass * 19557d92753SSimon Glass * This can be used to return an indication of the number of waiting 19657d92753SSimon Glass * characters if the driver knows this (e.g. by looking at the FIFO 19757d92753SSimon Glass * level). It is acceptable to return 1 if an indeterminant number 19857d92753SSimon Glass * of characters is waiting. 19957d92753SSimon Glass * 20057d92753SSimon Glass * This method is optional. 20157d92753SSimon Glass * 20257d92753SSimon Glass * @dev: Device pointer 20357d92753SSimon Glass * @input: true to check input characters, false for output 20457d92753SSimon Glass * @return number of waiting characters, 0 for none, -ve on error 20557d92753SSimon Glass */ 20657d92753SSimon Glass int (*pending)(struct udevice *dev, bool input); 20757d92753SSimon Glass /** 20857d92753SSimon Glass * clear() - Clear the serial FIFOs/holding registers 20957d92753SSimon Glass * 21057d92753SSimon Glass * This method is optional. 21157d92753SSimon Glass * 21257d92753SSimon Glass * This quickly clears any input/output characters from the UART. 21357d92753SSimon Glass * If this is not possible, but characters still exist, then it 21457d92753SSimon Glass * is acceptable to return -EAGAIN (try again) or -EINVAL (not 21557d92753SSimon Glass * supported). 21657d92753SSimon Glass * 21757d92753SSimon Glass * @dev: Device pointer 21857d92753SSimon Glass * @return 0 if OK, -ve on error 21957d92753SSimon Glass */ 22057d92753SSimon Glass int (*clear)(struct udevice *dev); 22157d92753SSimon Glass #if CONFIG_POST & CONFIG_SYS_POST_UART 22257d92753SSimon Glass /** 22357d92753SSimon Glass * loop() - Control serial device loopback mode 22457d92753SSimon Glass * 22557d92753SSimon Glass * @dev: Device pointer 22657d92753SSimon Glass * @on: 1 to turn loopback on, 0 to turn if off 22757d92753SSimon Glass */ 22857d92753SSimon Glass int (*loop)(struct udevice *dev, int on); 22957d92753SSimon Glass #endif 230cbf53883SPatrice Chotard 231cbf53883SPatrice Chotard /** 232ac7f5db9SAndy Shevchenko * getconfig() - Get the uart configuration 233ac7f5db9SAndy Shevchenko * (parity, 5/6/7/8 bits word length, stop bits) 234ac7f5db9SAndy Shevchenko * 235ac7f5db9SAndy Shevchenko * Get a current config for this device. 236ac7f5db9SAndy Shevchenko * 237ac7f5db9SAndy Shevchenko * @dev: Device pointer 238*eab647d5SSimon Glass * @serial_config: Returns config information (see SERIAL_... above) 239ac7f5db9SAndy Shevchenko * @return 0 if OK, -ve on error 240ac7f5db9SAndy Shevchenko */ 241ac7f5db9SAndy Shevchenko int (*getconfig)(struct udevice *dev, uint *serial_config); 242ac7f5db9SAndy Shevchenko /** 243cbf53883SPatrice Chotard * setconfig() - Set up the uart configuration 244cbf53883SPatrice Chotard * (parity, 5/6/7/8 bits word length, stop bits) 245cbf53883SPatrice Chotard * 246cbf53883SPatrice Chotard * Set up a new config for this device. 247cbf53883SPatrice Chotard * 248cbf53883SPatrice Chotard * @dev: Device pointer 2490a168687SSimon Goldschmidt * @serial_config: number of bits, parity and number of stopbits to use 250cbf53883SPatrice Chotard * @return 0 if OK, -ve on error 251cbf53883SPatrice Chotard */ 252cbf53883SPatrice Chotard int (*setconfig)(struct udevice *dev, uint serial_config); 253d5bb4f86SAndy Shevchenko /** 254d5bb4f86SAndy Shevchenko * getinfo() - Get serial device information 255d5bb4f86SAndy Shevchenko * 256d5bb4f86SAndy Shevchenko * @dev: Device pointer 257d5bb4f86SAndy Shevchenko * @info: struct serial_device_info to fill 258*eab647d5SSimon Glass * @return 0 if OK, -ve on error 259d5bb4f86SAndy Shevchenko */ 260d5bb4f86SAndy Shevchenko int (*getinfo)(struct udevice *dev, struct serial_device_info *info); 26157d92753SSimon Glass }; 26257d92753SSimon Glass 26357d92753SSimon Glass /** 26457d92753SSimon Glass * struct serial_dev_priv - information about a device used by the uclass 26557d92753SSimon Glass * 26657d92753SSimon Glass * @sdev: stdio device attached to this uart 2673ca7a06aSStefan Roese * 2683ca7a06aSStefan Roese * @buf: Pointer to the RX buffer 2693ca7a06aSStefan Roese * @rd_ptr: Read pointer in the RX buffer 2703ca7a06aSStefan Roese * @wr_ptr: Write pointer in the RX buffer 27157d92753SSimon Glass */ 27257d92753SSimon Glass struct serial_dev_priv { 27357d92753SSimon Glass struct stdio_dev *sdev; 2743ca7a06aSStefan Roese 2753ca7a06aSStefan Roese char *buf; 2763ca7a06aSStefan Roese int rd_ptr; 2773ca7a06aSStefan Roese int wr_ptr; 27857d92753SSimon Glass }; 27957d92753SSimon Glass 28057d92753SSimon Glass /* Access the serial operations for a device */ 28157d92753SSimon Glass #define serial_get_ops(dev) ((struct dm_serial_ops *)(dev)->driver->ops) 28257d92753SSimon Glass 283*eab647d5SSimon Glass /** 284*eab647d5SSimon Glass * serial_getconfig() - Get the uart configuration 285*eab647d5SSimon Glass * (parity, 5/6/7/8 bits word length, stop bits) 286*eab647d5SSimon Glass * 287*eab647d5SSimon Glass * Get a current config for this device. 288*eab647d5SSimon Glass * 289*eab647d5SSimon Glass * @dev: Device pointer 290*eab647d5SSimon Glass * @serial_config: Returns config information (see SERIAL_... above) 291*eab647d5SSimon Glass * @return 0 if OK, -ve on error 292*eab647d5SSimon Glass */ 29367d1b051SSimon Glass int serial_getconfig(struct udevice *dev, uint *config); 294*eab647d5SSimon Glass 295*eab647d5SSimon Glass /** 296*eab647d5SSimon Glass * serial_setconfig() - Set up the uart configuration 297*eab647d5SSimon Glass * (parity, 5/6/7/8 bits word length, stop bits) 298*eab647d5SSimon Glass * 299*eab647d5SSimon Glass * Set up a new config for this device. 300*eab647d5SSimon Glass * 301*eab647d5SSimon Glass * @dev: Device pointer 302*eab647d5SSimon Glass * @serial_config: number of bits, parity and number of stopbits to use 303*eab647d5SSimon Glass * @return 0 if OK, -ve on error 304*eab647d5SSimon Glass */ 3053de04e77SSimon Glass int serial_setconfig(struct udevice *dev, uint config); 306*eab647d5SSimon Glass 307*eab647d5SSimon Glass /** 308*eab647d5SSimon Glass * serial_getinfo() - Get serial device information 309*eab647d5SSimon Glass * 310*eab647d5SSimon Glass * @dev: Device pointer 311*eab647d5SSimon Glass * @info: struct serial_device_info to fill 312*eab647d5SSimon Glass * @return 0 if OK, -ve on error 313*eab647d5SSimon Glass */ 314a61cbad7SSimon Glass int serial_getinfo(struct udevice *dev, struct serial_device_info *info); 3150171f432SSimon Glass 31694a255dfSJeroen Hofstee void atmel_serial_initialize(void); 31794a255dfSJeroen Hofstee void mcf_serial_initialize(void); 31894a255dfSJeroen Hofstee void mpc85xx_serial_initialize(void); 31994a255dfSJeroen Hofstee void mxc_serial_initialize(void); 32094a255dfSJeroen Hofstee void ns16550_serial_initialize(void); 32194a255dfSJeroen Hofstee void pl01x_serial_initialize(void); 32294a255dfSJeroen Hofstee void pxa_serial_initialize(void); 32394a255dfSJeroen Hofstee void sh_serial_initialize(void); 32494a255dfSJeroen Hofstee 325281e00a3Swdenk #endif 326