/*
 * Copyright (c) 2022, NXP
 * SPDX-License-Identifier: Apache-2.0
 *
 * Note: File generated by gen_board_pinctrl.py
 * from mimxrt1170_evk.mex
 */

#include <nxp/nxp_imx/rt/mimxrt1176dvmaa-pinctrl.dtsi>

&pinctrl {
	/* conflicts with fxos8700 sensor */
	pinmux_csi: pinmux_csi {
		group0 {
			pinmux = <&iomuxc_gpio_disp_b2_14_gpio11_io15>;
			drive-strength = "high";
			bias-pull-down;
			slew-rate = "fast";
		};
		group1 {
			pinmux = <&iomuxc_gpio_ad_26_gpio9_io25>;
			drive-strength = "high";
			bias-pull-up;
			slew-rate = "fast";
		};
		group2 {
			pinmux = <&iomuxc_lpsr_gpio_lpsr_07_lpi2c6_scl>,
				<&iomuxc_lpsr_gpio_lpsr_06_lpi2c6_sda>;
			drive-strength = "high";
			slew-rate = "fast";
			input-enable;
		};
	};

	pinmux_enet: pinmux_enet {
		group0 {
			pinmux = <&iomuxc_gpio_ad_12_gpio9_io11>,
				<&iomuxc_gpio_disp_b2_08_enet_rx_en>,
				<&iomuxc_gpio_disp_b2_09_enet_rx_er>;
			drive-strength = "high";
			bias-pull-down;
			slew-rate = "fast";
		};
		group1 {
			pinmux = <&iomuxc_gpio_disp_b2_06_enet_rdata00>,
				<&iomuxc_gpio_disp_b2_07_enet_rdata01>;
			drive-strength = "high";
			bias-pull-down;
			slew-rate = "fast";
			input-enable;
		};
		group2 {
			pinmux = <&iomuxc_lpsr_gpio_lpsr_12_gpio12_io12>;
			drive-strength = "high";
			bias-pull-up;
			slew-rate = "fast";
		};
		group3 {
			pinmux = <&iomuxc_gpio_ad_32_enet_mdc>,
				<&iomuxc_gpio_ad_33_enet_mdio>,
				<&iomuxc_gpio_disp_b2_02_enet_tdata00>,
				<&iomuxc_gpio_disp_b2_03_enet_tdata01>,
				<&iomuxc_gpio_disp_b2_04_enet_tx_en>;
			drive-strength = "high";
			slew-rate = "fast";
		};
		group4 {
			pinmux = <&iomuxc_gpio_disp_b2_05_enet_ref_clk>;
			drive-strength = "high";
			slew-rate = "slow";
			input-enable;
		};
	};

	pinmux_flexcan3: pinmux_flexcan3 {
		group0 {
			pinmux = <&iomuxc_lpsr_gpio_lpsr_01_can3_rx>,
				<&iomuxc_lpsr_gpio_lpsr_00_can3_tx>;
			drive-strength = "high";
			slew-rate = "fast";
		};
	};

	pinmux_flexpwm1: pinmux_flexpwm1 {
		group0 {
			pinmux = <&iomuxc_gpio_ad_04_flexpwm1_pwm2_a>;
			drive-strength = "high";
			slew-rate = "fast";
		};
	};

	pinmux_flexspi1: pinmux_flexspi1 {
		group0 {
			pinmux = <&iomuxc_gpio_sd_b2_05_flexspi1_a_dqs>,
				<&iomuxc_gpio_sd_b2_06_flexspi1_a_ss0_b>,
				<&iomuxc_gpio_sd_b2_07_flexspi1_a_sclk>,
				<&iomuxc_gpio_sd_b2_08_flexspi1_a_data00>,
				<&iomuxc_gpio_sd_b2_09_flexspi1_a_data01>,
				<&iomuxc_gpio_sd_b2_10_flexspi1_a_data02>,
				<&iomuxc_gpio_sd_b2_11_flexspi1_a_data03>;
			bias-pull-down;
			input-enable;
		};
	};

	/* interrupt gpios for fxos8700 */
	pinmux_fxos8700_int: pinmux_fxos8700_int {
		group0 {
			pinmux = <&iomuxc_gpio_disp_b2_14_gpio11_io15>,
				<&iomuxc_gpio_disp_b2_13_gpio11_io14>;
			drive-strength = "high";
			slew-rate = "fast";
		};
	};

	/* conflicts with lpspi1 */
	pinmux_lcdif: pinmux_lcdif {
		group0 {
			pinmux = <&iomuxc_gpio_ad_30_gpio9_io29>,
				<&iomuxc_gpio_ad_02_gpio9_io01>;
			drive-strength = "high";
			bias-pull-down;
			slew-rate = "fast";
		};
		group1 {
			pinmux = <&iomuxc_gpio_disp_b2_15_gpio11_io16>;
			drive-strength = "high";
			bias-pull-up;
			slew-rate = "fast";
		};
	};

	pinmux_lpadc0: pinmux_lpadc0 {
		group0 {
			pinmux = <&iomuxc_gpio_ad_06_adc1_ch0a>;
			drive-strength = "high";
			bias-pull-down;
			slew-rate = "fast";
		};
	};

	pinmux_lpi2c1: pinmux_lpi2c1 {
		group0 {
			pinmux = <&iomuxc_gpio_ad_08_lpi2c1_scl>,
				<&iomuxc_gpio_ad_09_lpi2c1_sda>;
			drive-strength = "normal";
			drive-open-drain;
			slew-rate = "fast";
			input-enable;
		};
	};

	/* Connected to FXOS8700 */
	pinmux_lpi2c5: pinmux_lpi2c5 {
		group0 {
			pinmux = <&iomuxc_lpsr_gpio_lpsr_05_lpi2c5_scl>,
				<&iomuxc_lpsr_gpio_lpsr_04_lpi2c5_sda>;
			drive-strength = "normal";
			drive-open-drain;
			slew-rate = "fast";
			input-enable;
		};
	};

	pinmux_lpspi1: pinmux_lpspi1 {
		group0 {
			pinmux = <&iomuxc_gpio_ad_29_lpspi1_pcs0>,
				<&iomuxc_gpio_ad_28_lpspi1_sck>,
				<&iomuxc_gpio_ad_31_lpspi1_sdi>,
				<&iomuxc_gpio_ad_30_lpspi1_sdo>;
			drive-strength = "high";
			slew-rate = "fast";
		};
	};

	pinmux_lpuart1: pinmux_lpuart1 {
		group0 {
			pinmux = <&iomuxc_gpio_ad_25_lpuart1_rx>,
				<&iomuxc_gpio_ad_24_lpuart1_tx>;
			drive-strength = "high";
			slew-rate = "fast";
		};
	};

	pinmux_lpuart1_sleep: pinmux_lpuart1_sleep {
		group0 {
			pinmux = <&iomuxc_gpio_ad_25_gpio_mux3_io24>;
			drive-strength = "high";
			bias-pull-up;
			slew-rate = "fast";
		};
		group1 {
			pinmux = <&iomuxc_gpio_ad_24_lpuart1_tx>;
			drive-strength = "high";
			slew-rate = "fast";
		};
	};

	pinmux_lpuart2: pinmux_lpuart2 {
		group0 {
			pinmux = <&iomuxc_gpio_disp_b2_11_lpuart2_rx>,
				<&iomuxc_gpio_disp_b2_10_lpuart2_tx>;
			drive-strength = "high";
			slew-rate = "fast";
		};
	};

	pinmux_lpuart2_sleep: pinmux_lpuart2_sleep {
		group0 {
			pinmux = <&iomuxc_gpio_disp_b2_11_gpio_mux5_io12>;
			drive-strength = "high";
			bias-pull-up;
			slew-rate = "fast";
		};
		group1 {
			pinmux = <&iomuxc_gpio_disp_b2_10_lpuart2_tx>;
			drive-strength = "high";
			slew-rate = "fast";
		};
	};

	/* intentionally left empty */
	pinmux_ptp: pinmux_ptp {
	};

	pinmux_sai1: pinmux_sai1 {
		group0 {
			pinmux = <&iomuxc_gpio_ad_17_sai1_mclk>,
				<&iomuxc_gpio_ad_18_sai1_rx_sync>,
				<&iomuxc_gpio_ad_19_sai1_rx_bclk>,
				<&iomuxc_gpio_ad_20_sai1_rx_data00>,
				<&iomuxc_gpio_ad_21_sai1_tx_data00>,
				<&iomuxc_gpio_ad_22_sai1_tx_bclk>,
				<&iomuxc_gpio_ad_23_sai1_tx_sync>;
			drive-strength = "high";
			slew-rate = "fast";
			input-enable;
		};
	};

	pinmux_sai4: pinmux_sai4 {
		group0 {
			pinmux = <&iomuxc_lpsr_gpio_lpsr_09_sai4_tx_data>,
				<&iomuxc_lpsr_gpio_lpsr_10_sai4_tx_sync>,
				<&iomuxc_lpsr_gpio_lpsr_12_sai4_tx_bclk>;
			drive-strength = "high";
			slew-rate = "fast";
			input-enable;
		};
	};

	/* conflicts with enet pins */
	pinmux_usdhc1: pinmux_usdhc1 {
		group0 {
			pinmux = <&iomuxc_gpio_sd_b1_00_usdhc1_cmd>,
				<&iomuxc_gpio_sd_b1_01_usdhc1_clk>,
				<&iomuxc_gpio_sd_b1_02_usdhc1_data0>,
				<&iomuxc_gpio_sd_b1_03_usdhc1_data1>,
				<&iomuxc_gpio_sd_b1_04_usdhc1_data2>,
				<&iomuxc_gpio_sd_b1_05_usdhc1_data3>;
			bias-pull-up;
			input-enable;
		};
		group1 {
			pinmux = <&iomuxc_gpio_ad_34_usdhc1_vselect>,
				<&iomuxc_gpio_ad_32_gpio_mux3_io31_cm7>;
			drive-strength = "high";
			bias-pull-down;
			slew-rate = "fast";
		};
		group2 {
			pinmux = <&iomuxc_gpio_ad_35_gpio10_io02>;
			drive-strength = "high";
			bias-pull-up;
			slew-rate = "fast";
		};
	};

	/* removes pull on dat3 for card detect */
	pinmux_usdhc1_dat3_nopull: pinmux_usdhc1_dat3_nopull {
		group0 {
			pinmux = <&iomuxc_gpio_sd_b1_05_usdhc1_data3>;
			bias-disable;
			input-enable;
		};
		group1 {
			pinmux = <&iomuxc_gpio_sd_b1_00_usdhc1_cmd>,
				<&iomuxc_gpio_sd_b1_01_usdhc1_clk>,
				<&iomuxc_gpio_sd_b1_02_usdhc1_data0>,
				<&iomuxc_gpio_sd_b1_03_usdhc1_data1>,
				<&iomuxc_gpio_sd_b1_04_usdhc1_data2>;
			bias-pull-up;
			input-enable;
		};
		group2 {
			pinmux = <&iomuxc_gpio_ad_34_usdhc1_vselect>,
				<&iomuxc_gpio_ad_32_gpio_mux3_io31_cm7>;
			drive-strength = "high";
			bias-pull-down;
			slew-rate = "fast";
		};
		group3 {
			pinmux = <&iomuxc_gpio_ad_35_gpio10_io02>;
			drive-strength = "high";
			bias-pull-up;
			slew-rate = "fast";
		};
	};

};

