mirror of
https://xff.cz/git/u-boot/
synced 2025-09-01 08:42:12 +02:00
dm: serial: Add driver model support for ns16550
Add driver model support so that ns16550 can support operation both with and without driver model. The driver needs a clock frequency so cannot stand alone unfortunately. The clock frequency must be provided by a separate driver. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
@@ -23,6 +23,14 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#ifdef CONFIG_DM_SERIAL
|
||||
/*
|
||||
* For driver model we always use one byte per register, and sort out the
|
||||
* differences in the driver
|
||||
*/
|
||||
#define CONFIG_SYS_NS16550_REG_SIZE (-1)
|
||||
#endif
|
||||
|
||||
#if !defined(CONFIG_SYS_NS16550_REG_SIZE) || (CONFIG_SYS_NS16550_REG_SIZE == 0)
|
||||
#error "Please define NS16550 registers size."
|
||||
#elif defined(CONFIG_SYS_NS16550_MEM32)
|
||||
@@ -37,6 +45,21 @@
|
||||
unsigned char postpad_##x[-CONFIG_SYS_NS16550_REG_SIZE - 1];
|
||||
#endif
|
||||
|
||||
/**
|
||||
* struct ns16550_platdata - information about a NS16550 port
|
||||
*
|
||||
* @base: Base register address
|
||||
* @reg_shift: Shift size of registers (0=byte, 1=16bit, 2=32bit...)
|
||||
* @clock: UART base clock speed in Hz
|
||||
*/
|
||||
struct ns16550_platdata {
|
||||
unsigned char *base;
|
||||
int reg_shift;
|
||||
int clock;
|
||||
};
|
||||
|
||||
struct udevice;
|
||||
|
||||
struct NS16550 {
|
||||
UART_REG(rbr); /* 0 */
|
||||
UART_REG(ier); /* 1 */
|
||||
@@ -65,6 +88,9 @@ struct NS16550 {
|
||||
UART_REG(scr); /* 10*/
|
||||
UART_REG(ssr); /* 11*/
|
||||
#endif
|
||||
#ifdef CONFIG_DM_SERIAL
|
||||
struct ns16550_platdata *plat;
|
||||
#endif
|
||||
};
|
||||
|
||||
#define thr rbr
|
||||
@@ -183,3 +209,30 @@ void NS16550_reinit(NS16550_t com_port, int baud_divisor);
|
||||
* @return baud rate divisor that should be used
|
||||
*/
|
||||
int ns16550_calc_divisor(NS16550_t port, int clock, int baudrate);
|
||||
|
||||
/**
|
||||
* ns16550_serial_ofdata_to_platdata() - convert DT to platform data
|
||||
*
|
||||
* Decode a device tree node for an ns16550 device. This includes the
|
||||
* register base address and register shift properties. The caller must set
|
||||
* up the clock frequency.
|
||||
*
|
||||
* @dev: dev to decode platform data for
|
||||
* @return: 0 if OK, -EINVAL on error
|
||||
*/
|
||||
int ns16550_serial_ofdata_to_platdata(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* ns16550_serial_probe() - probe a serial port
|
||||
*
|
||||
* This sets up the serial port ready for use, except for the baud rate
|
||||
* @return 0, or -ve on error
|
||||
*/
|
||||
int ns16550_serial_probe(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* struct ns16550_serial_ops - ns16550 serial operations
|
||||
*
|
||||
* These should be used by the client driver for the driver's 'ops' member
|
||||
*/
|
||||
extern const struct dm_serial_ops ns16550_serial_ops;
|
||||
|
Reference in New Issue
Block a user