i2c: mec15xx: add pinctrl for mec15xx/mec1501 i2c

Remove pinmux calls and add pinctrl support for mec15xx
and mec1501 pwm. Update board dts, pinmux and driver files.

Signed-off-by: Jay Vasanth <jay.vasanth@microchip.com>
diff --git a/boards/arm/mec1501modular_assy6885/mec1501modular_assy6885.dts b/boards/arm/mec1501modular_assy6885/mec1501modular_assy6885.dts
index 2dbe8b9..1236cb7 100644
--- a/boards/arm/mec1501modular_assy6885/mec1501modular_assy6885.dts
+++ b/boards/arm/mec1501modular_assy6885/mec1501modular_assy6885.dts
@@ -63,6 +63,8 @@
 	port_sel = <0>;
 	sda-gpios = <&gpio_000_036 3 0>;
 	scl-gpios = <&gpio_000_036 4 0>;
+	pinctrl-0 = < &i2c00_scl_gpio004 &i2c00_sda_gpio003 >;
+	pinctrl-names = "default";
 };
 
 &i2c_smb_1 {
@@ -70,6 +72,8 @@
 	port_sel = <1>;
 	sda-gpios = <&gpio_100_136 24 0>;
 	scl-gpios = <&gpio_100_136 25 0>;
+	pinctrl-0 = < &i2c01_scl_gpio131 &i2c01_sda_gpio130 >;
+	pinctrl-names = "default";
 };
 
 &espi0 {
diff --git a/boards/arm/mec1501modular_assy6885/pinmux.c b/boards/arm/mec1501modular_assy6885/pinmux.c
index 27c0723..2944037 100644
--- a/boards/arm/mec1501modular_assy6885/pinmux.c
+++ b/boards/arm/mec1501modular_assy6885/pinmux.c
@@ -32,74 +32,6 @@
 #endif
 };
 
-#ifdef CONFIG_I2C_XEC
-static void i2c_pinmux(struct pinmux_ports_t *p, uint8_t port_sel)
-{
-	switch (port_sel) {
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(pinmux_000_036), okay)
-	case 0:
-		pinmux_pin_set(p->porta, MCHP_GPIO_003, MCHP_GPIO_CTRL_MUX_F1);
-		pinmux_pin_set(p->porta, MCHP_GPIO_004, MCHP_GPIO_CTRL_MUX_F1);
-		break;
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(pinmux_100_136), okay)
-	case 1:
-		pinmux_pin_set(p->portc, MCHP_GPIO_130, MCHP_GPIO_CTRL_MUX_F1);
-		pinmux_pin_set(p->portc, MCHP_GPIO_131, MCHP_GPIO_CTRL_MUX_F1);
-		break;
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(pinmux_140_176), okay)
-	case 2:
-		pinmux_pin_set(p->portd, MCHP_GPIO_154, MCHP_GPIO_CTRL_MUX_F1);
-		pinmux_pin_set(p->portd, MCHP_GPIO_155, MCHP_GPIO_CTRL_MUX_F1);
-		break;
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(pinmux_000_036), okay)
-	case 3:
-		pinmux_pin_set(p->porta, MCHP_GPIO_007, MCHP_GPIO_CTRL_MUX_F1);
-		pinmux_pin_set(p->porta, MCHP_GPIO_010, MCHP_GPIO_CTRL_MUX_F1);
-		break;
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(pinmux_140_176), okay)
-	case 4:
-		pinmux_pin_set(p->portd, MCHP_GPIO_143, MCHP_GPIO_CTRL_MUX_F1);
-		pinmux_pin_set(p->portd, MCHP_GPIO_144, MCHP_GPIO_CTRL_MUX_F1);
-		break;
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(pinmux_140_176), okay)
-	case 5:
-		pinmux_pin_set(p->portd, MCHP_GPIO_141, MCHP_GPIO_CTRL_MUX_F1);
-		pinmux_pin_set(p->portd, MCHP_GPIO_142, MCHP_GPIO_CTRL_MUX_F1);
-		break;
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(pinmux_100_136), okay)
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(pinmux_140_176), okay)
-	case 6:
-		pinmux_pin_set(p->portc, MCHP_GPIO_132, MCHP_GPIO_CTRL_MUX_F1);
-		pinmux_pin_set(p->portd, MCHP_GPIO_140, MCHP_GPIO_CTRL_MUX_F1);
-		break;
-#endif
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(pinmux_000_036), okay)
-	case 7:
-		pinmux_pin_set(p->porta, MCHP_GPIO_012, MCHP_GPIO_CTRL_MUX_F1);
-		pinmux_pin_set(p->porta, MCHP_GPIO_013, MCHP_GPIO_CTRL_MUX_F1);
-		break;
-#endif
-
-	default:
-		break;
-	}
-}
-#endif
-
 static void configure_debug_interface(void)
 {
 	/* No debug support */
@@ -239,30 +171,6 @@
 	pinmux_pin_set(portb, MCHP_GPIO_067, MCHP_GPIO_CTRL_MUX_F1);
 #endif /* CONFIG_ADC_XEC */
 
-#ifdef CONFIG_I2C_XEC
-
-#if DT_NODE_HAS_STATUS(DT_INST(0, microchip_xec_i2c), okay)
-	i2c_pinmux(&pinmux_ports, DT_PROP(DT_INST(0, microchip_xec_i2c), port_sel));
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_INST(1, microchip_xec_i2c), okay)
-	i2c_pinmux(&pinmux_ports, DT_PROP(DT_INST(1, microchip_xec_i2c), port_sel));
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_INST(2, microchip_xec_i2c), okay)
-	i2c_pinmux(&pinmux_ports, DT_PROP(DT_INST(2, microchip_xec_i2c), port_sel));
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_INST(3, microchip_xec_i2c), okay)
-	i2c_pinmux(&pinmux_ports, DT_PROP(DT_INST(3, microchip_xec_i2c), port_sel));
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_INST(4, microchip_xec_i2c), okay)
-	i2c_pinmux(&pinmux_ports, DT_PROP(DT_INST(4, microchip_xec_i2c), port_sel));
-#endif
-
-#endif /* CONFIG_I2C_XEC */
-
 #ifdef CONFIG_SPI_XEC_QMSPI
 #if DT_NODE_HAS_STATUS(DT_INST(0, microchip_xec_qmspi), okay)
 	mchp_pcr_periph_slp_ctrl(PCR_QMSPI, MCHP_PCR_SLEEP_DIS);
diff --git a/boards/arm/mec15xxevb_assy6853/mec15xxevb_assy6853.dts b/boards/arm/mec15xxevb_assy6853/mec15xxevb_assy6853.dts
index 4e92973..80b1d7f 100644
--- a/boards/arm/mec15xxevb_assy6853/mec15xxevb_assy6853.dts
+++ b/boards/arm/mec15xxevb_assy6853/mec15xxevb_assy6853.dts
@@ -91,6 +91,8 @@
 	port_sel = <0>;
 	sda-gpios = <&gpio_000_036 3 0>;
 	scl-gpios = <&gpio_000_036 4 0>;
+	pinctrl-0 = < &i2c00_scl_gpio004 &i2c00_sda_gpio003 >;
+	pinctrl-names = "default";
 };
 
 &i2c_smb_1 {
@@ -98,6 +100,8 @@
 	port_sel = <1>;
 	sda-gpios = <&gpio_100_136 24 0>;
 	scl-gpios = <&gpio_100_136 25 0>;
+	pinctrl-0 = < &i2c01_scl_gpio131 &i2c01_sda_gpio130 >;
+	pinctrl-names = "default";
 
 	pca9555@26 {
 		compatible = "nxp,pca95xx";
@@ -121,6 +125,8 @@
 	port_sel = <7>;
 	sda-gpios = <&gpio_000_036 10 0>;
 	scl-gpios = <&gpio_000_036 11 0>;
+	pinctrl-0 = < &i2c07_scl_gpio013 &i2c07_sda_gpio012 >;
+	pinctrl-names = "default";
 };
 
 &espi0 {
diff --git a/boards/arm/mec15xxevb_assy6853/pinmux.c b/boards/arm/mec15xxevb_assy6853/pinmux.c
index e233b2b..1d325a3 100644
--- a/boards/arm/mec15xxevb_assy6853/pinmux.c
+++ b/boards/arm/mec15xxevb_assy6853/pinmux.c
@@ -32,74 +32,6 @@
 #endif
 };
 
-#ifdef CONFIG_I2C_XEC
-static void i2c_pinmux(struct pinmux_ports_t *p, uint8_t port_sel)
-{
-	switch (port_sel) {
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(pinmux_000_036), okay)
-	case 0:
-		pinmux_pin_set(p->porta, MCHP_GPIO_003, MCHP_GPIO_CTRL_MUX_F1);
-		pinmux_pin_set(p->porta, MCHP_GPIO_004, MCHP_GPIO_CTRL_MUX_F1);
-		break;
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(pinmux_100_136), okay)
-	case 1:
-		pinmux_pin_set(p->portc, MCHP_GPIO_130, MCHP_GPIO_CTRL_MUX_F1);
-		pinmux_pin_set(p->portc, MCHP_GPIO_131, MCHP_GPIO_CTRL_MUX_F1);
-		break;
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(pinmux_140_176), okay)
-	case 2:
-		pinmux_pin_set(p->portd, MCHP_GPIO_154, MCHP_GPIO_CTRL_MUX_F1);
-		pinmux_pin_set(p->portd, MCHP_GPIO_155, MCHP_GPIO_CTRL_MUX_F1);
-		break;
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(pinmux_000_036), okay)
-	case 3:
-		pinmux_pin_set(p->porta, MCHP_GPIO_007, MCHP_GPIO_CTRL_MUX_F1);
-		pinmux_pin_set(p->porta, MCHP_GPIO_010, MCHP_GPIO_CTRL_MUX_F1);
-		break;
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(pinmux_140_176), okay)
-	case 4:
-		pinmux_pin_set(p->portd, MCHP_GPIO_143, MCHP_GPIO_CTRL_MUX_F1);
-		pinmux_pin_set(p->portd, MCHP_GPIO_144, MCHP_GPIO_CTRL_MUX_F1);
-		break;
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(pinmux_140_176), okay)
-	case 5:
-		pinmux_pin_set(p->portd, MCHP_GPIO_141, MCHP_GPIO_CTRL_MUX_F1);
-		pinmux_pin_set(p->portd, MCHP_GPIO_142, MCHP_GPIO_CTRL_MUX_F1);
-		break;
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(pinmux_100_136), okay)
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(pinmux_140_176), okay)
-	case 6:
-		pinmux_pin_set(p->portc, MCHP_GPIO_132, MCHP_GPIO_CTRL_MUX_F1);
-		pinmux_pin_set(p->portd, MCHP_GPIO_140, MCHP_GPIO_CTRL_MUX_F1);
-		break;
-#endif
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(pinmux_000_036), okay)
-	case 7:
-		pinmux_pin_set(p->porta, MCHP_GPIO_012, MCHP_GPIO_CTRL_MUX_F1);
-		pinmux_pin_set(p->porta, MCHP_GPIO_013, MCHP_GPIO_CTRL_MUX_F1);
-		break;
-#endif
-
-	default:
-		break;
-	}
-}
-#endif
-
 static void configure_debug_interface(void)
 {
 	/* No debug support */
@@ -229,30 +161,6 @@
 	pinmux_pin_set(portb, MCHP_GPIO_067, MCHP_GPIO_CTRL_MUX_F1);
 #endif /* CONFIG_ADC_XEC */
 
-#ifdef CONFIG_I2C_XEC
-
-#if DT_NODE_HAS_STATUS(DT_INST(0, microchip_xec_i2c), okay)
-	i2c_pinmux(&pinmux_ports, DT_PROP(DT_INST(0, microchip_xec_i2c), port_sel));
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_INST(1, microchip_xec_i2c), okay)
-	i2c_pinmux(&pinmux_ports, DT_PROP(DT_INST(1, microchip_xec_i2c), port_sel));
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_INST(2, microchip_xec_i2c), okay)
-	i2c_pinmux(&pinmux_ports, DT_PROP(DT_INST(2, microchip_xec_i2c), port_sel));
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_INST(3, microchip_xec_i2c), okay)
-	i2c_pinmux(&pinmux_ports, DT_PROP(DT_INST(3, microchip_xec_i2c), port_sel));
-#endif
-
-#if DT_NODE_HAS_STATUS(DT_INST(4, microchip_xec_i2c), okay)
-	i2c_pinmux(&pinmux_ports, DT_PROP(DT_INST(4, microchip_xec_i2c), port_sel));
-#endif
-
-#endif /* CONFIG_I2C_XEC */
-
 #ifdef CONFIG_SPI_XEC_QMSPI
 #if DT_NODE_HAS_STATUS(DT_INST(0, microchip_xec_qmspi), okay)
 	mchp_pcr_periph_slp_ctrl(PCR_QMSPI, MCHP_PCR_SLEEP_DIS);
diff --git a/drivers/i2c/i2c_mchp_xec.c b/drivers/i2c/i2c_mchp_xec.c
index 523bc8b..35ab74c 100644
--- a/drivers/i2c/i2c_mchp_xec.c
+++ b/drivers/i2c/i2c_mchp_xec.c
@@ -12,6 +12,7 @@
 #include <errno.h>
 #include <zephyr/drivers/gpio.h>
 #include <zephyr/drivers/i2c.h>
+#include <zephyr/drivers/pinctrl.h>
 #include <zephyr/logging/log.h>
 LOG_MODULE_REGISTER(i2c_mchp, CONFIG_I2C_LOG_LEVEL);
 
@@ -49,6 +50,7 @@
 	uint8_t girq_bit;
 	struct gpio_dt_spec sda_gpio;
 	struct gpio_dt_spec scl_gpio;
+	const struct pinctrl_dev_config *pcfg;
 	void (*irq_config_func)(void);
 };
 
@@ -849,6 +851,12 @@
 	data->pending_stop = 0;
 	data->slave_attached = false;
 
+	ret = pinctrl_apply_state(cfg->pcfg, PINCTRL_STATE_DEFAULT);
+	if (ret != 0) {
+		LOG_ERR("XEC I2C pinctrl setup failed (%d)", ret);
+		return ret;
+	}
+
 	if (!device_is_ready(cfg->sda_gpio.port)) {
 		LOG_ERR("%s GPIO device is not ready for SDA GPIO", dev->name);
 		return -ENODEV;
@@ -878,6 +886,9 @@
 }
 
 #define I2C_XEC_DEVICE(n)						\
+									\
+	PINCTRL_DT_INST_DEFINE(n);					\
+									\
 	static void i2c_xec_irq_config_func_##n(void);			\
 									\
 	static struct i2c_xec_data i2c_xec_data_##n;			\
@@ -890,6 +901,7 @@
 		.sda_gpio = GPIO_DT_SPEC_INST_GET(n, sda_gpios),	\
 		.scl_gpio = GPIO_DT_SPEC_INST_GET(n, scl_gpios),	\
 		.irq_config_func = i2c_xec_irq_config_func_##n,		\
+		.pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n),		\
 	};								\
 	I2C_DEVICE_DT_INST_DEFINE(n, i2c_xec_init, NULL,	\
 		&i2c_xec_data_##n, &i2c_xec_config_##n,			\
diff --git a/dts/bindings/i2c/microchip,xec-i2c.yaml b/dts/bindings/i2c/microchip,xec-i2c.yaml
index f9febd3..50cdc53 100644
--- a/dts/bindings/i2c/microchip,xec-i2c.yaml
+++ b/dts/bindings/i2c/microchip,xec-i2c.yaml
@@ -5,7 +5,7 @@
 
 compatible: "microchip,xec-i2c"
 
-include: i2c-controller.yaml
+include: [i2c-controller.yaml, pinctrl-device.yaml]
 
 properties:
     reg:
@@ -26,6 +26,12 @@
       required: true
       description: Bit position in GIRQ for this device
 
+    pinctrl-0:
+      required: true
+
+    pinctrl-names:
+      required: true
+
     sda-gpios:
       type: phandle-array
       required: true