aboutsummaryrefslogtreecommitdiff
path: root/include/ns16550.h
diff options
context:
space:
mode:
authorSimon Glass2014-09-04 16:27:34 -0600
committerSimon Glass2014-09-10 13:00:01 -0600
commit12e431b2777ce3b6940d7b7f1e32e28f58277560 (patch)
tree12328a53b7244f5ae078d7d56b2b29a99a3f23a1 /include/ns16550.h
parent8bbe33c829c83b7a6315bbc16875f79ba4adac47 (diff)
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>
Diffstat (limited to 'include/ns16550.h')
-rw-r--r--include/ns16550.h53
1 files changed, 53 insertions, 0 deletions
diff --git a/include/ns16550.h b/include/ns16550.h
index d93e28e3eca..5784cfd97b8 100644
--- a/include/ns16550.h
+++ b/include/ns16550.h
@@ -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;