drivers: serial: Add pinctrl support to the NS16550 driver

This enables configuring pins for the UART

Signed-off-by: Grant Ramsay <gramsay@enphaseenergy.com>
diff --git a/drivers/serial/uart_ns16550.c b/drivers/serial/uart_ns16550.c
index b40f867..ae73794 100644
--- a/drivers/serial/uart_ns16550.c
+++ b/drivers/serial/uart_ns16550.c
@@ -34,6 +34,10 @@
 #include <zephyr/spinlock.h>
 #include <zephyr/irq.h>
 
+#if defined(CONFIG_PINCTRL)
+#include <zephyr/drivers/pinctrl.h>
+#endif
+
 #include <zephyr/drivers/serial/uart_ns16550.h>
 
 #define INST_HAS_PCP_HELPER(inst) DT_INST_NODE_HAS_PROP(inst, pcp) ||
@@ -239,6 +243,9 @@
 #if DT_ANY_INST_ON_BUS_STATUS_OKAY(pcie)
 	struct pcie_dev *pcie;
 #endif
+#if defined(CONFIG_PINCTRL)
+	const struct pinctrl_dev_config *pincfg;
+#endif
 };
 
 /** Device data structure */
@@ -328,6 +335,12 @@
 	ARG_UNUSED(dev_data);
 	ARG_UNUSED(dev_cfg);
 
+#if defined(CONFIG_PINCTRL)
+	if (dev_cfg->pincfg != NULL) {
+		pinctrl_apply_state(dev_cfg->pincfg, PINCTRL_STATE_DEFAULT);
+	}
+#endif
+
 #ifndef CONFIG_UART_NS16550_ACCESS_IOPORT
 #if DT_ANY_INST_ON_BUS_STATUS_OKAY(pcie)
 	if (dev_cfg->pcie) {
@@ -1130,6 +1143,8 @@
 #define UART_NS16550_DEVICE_INIT(n)                                                  \
 	UART_NS16550_IRQ_FUNC_DECLARE(n);                                            \
 	DEV_PCIE_DECLARE(n);                                                         \
+	IF_ENABLED(DT_INST_NODE_HAS_PROP(n, pinctrl_0),                              \
+		(PINCTRL_DT_INST_DEFINE(n)));                                        \
 	static const struct uart_ns16550_device_config uart_ns16550_dev_cfg_##n = {  \
 		DEV_CONFIG_REG_INIT(n)                                               \
 		COND_CODE_1(DT_INST_NODE_HAS_PROP(n, clock_frequency), (             \
@@ -1147,6 +1162,8 @@
 		DEV_CONFIG_PCP_INIT(n)                                               \
 		.reg_interval = (1 << DT_INST_PROP(n, reg_shift)),                   \
 		DEV_CONFIG_PCIE_INIT(n)                                              \
+		IF_ENABLED(DT_INST_NODE_HAS_PROP(n, pinctrl_0),                      \
+			(.pincfg = PINCTRL_DT_DEV_CONFIG_GET(DT_DRV_INST(n)),))      \
 	};                                                                           \
 	static struct uart_ns16550_dev_data uart_ns16550_dev_data_##n = {            \
 		.uart_config.baudrate = DT_INST_PROP_OR(n, current_speed, 0),        \
diff --git a/dts/bindings/serial/ns16550.yaml b/dts/bindings/serial/ns16550.yaml
index 8823d23..3e2c6b4 100644
--- a/dts/bindings/serial/ns16550.yaml
+++ b/dts/bindings/serial/ns16550.yaml
@@ -2,7 +2,7 @@
 
 compatible: "ns16550"
 
-include: [uart-controller.yaml, pcie-device.yaml]
+include: [uart-controller.yaml, pcie-device.yaml, pinctrl-device.yaml]
 
 properties:
   reg-shift: