xref: /openbmc/u-boot/include/serial.h (revision 77c07e7e)
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