// SPDX-License-Identifier: (GPL-2.0+ OR MIT) /* * Copyright 2024 Yazan Shhady * Copyright 2025 Josua Mayer */ /dts-v1/; #include #include #include "imx8mp-sr-som.dtsi" / { compatible = "solidrun,imx8mp-hummingboard-iiot", "solidrun,imx8mp-sr-som", "fsl,imx8mp"; model = "SolidRun i.MX8MP HummingBoard IIoT"; /* power for M.2 B-Key connector (J6) */ regulator-m2-b { compatible = "regulator-fixed"; regulator-name = "m2-b"; gpios = <&tca6416_u20 5 GPIO_ACTIVE_HIGH>; regulator-always-on; regulator-max-microvolt = <3300000>; regulator-min-microvolt = <3300000>; enable-active-high; }; /* power for M.2 M-Key connector (J4) */ regulator-m2-m { compatible = "regulator-fixed"; regulator-name = "m2-m"; gpios = <&tca6416_u20 6 GPIO_ACTIVE_HIGH>; regulator-always-on; regulator-max-microvolt = <3300000>; regulator-min-microvolt = <3300000>; enable-active-high; }; /* power for USB-A J27 behind USB Hub Port 3 */ regulator-vbus-2 { compatible = "regulator-fixed"; regulator-name = "vbus2"; regulator-always-on; regulator-max-microvolt = <5000000>; regulator-min-microvolt = <5000000>; gpio = <&tca6416_u20 12 GPIO_ACTIVE_HIGH>; enable-active-high; }; /* power for USB-A J27 behind USB Hub Port 4 */ regulator-vbus-3 { compatible = "regulator-fixed"; regulator-name = "vbus3"; regulator-always-on; regulator-max-microvolt = <5000000>; regulator-min-microvolt = <5000000>; gpio = <&tca6416_u20 13 GPIO_ACTIVE_HIGH>; enable-active-high; }; aliases { /* J10 */ ethernet0 = &eqos; /* J11 */ ethernet1 = &fec; gpio5 = &tca6408_u48; gpio6 = &tca6408_u37; gpio7 = &tca6416_u20; gpio8 = &tca6416_u21; i2c6 = &i2c_exp; i2c7 = &i2c_csi; i2c8 = &i2c_dsi; i2c9 = &i2c_lvds; rtc0 = &carrier_rtc; rtc1 = &snvs_rtc; }; gpio-keys { compatible = "gpio-keys"; wakeup-event { interrupts-extended = <&tca6416_u21 11 IRQ_TYPE_EDGE_FALLING>; label = "m2-m-wakeup"; wakeup-source; linux,code = ; }; }; can_mux: mux-controller-0 { compatible = "gpio-mux"; /* * Mux routes CAN bus signals between SoM connector pins, * expansion connector (J22) and on-board transceivers using * two GPIO: * - IO3: 0 = on-board transceivers, 1 = expansion connector * - IO4: 0 = J9-55/57/59/61, 1 = J7-12/16 & J9-54/56 */ mux-gpios = <&tca6416_u20 3 GPIO_ACTIVE_HIGH>, <&tca6416_u20 4 GPIO_ACTIVE_HIGH>; /* default J7-12/16 & J9-54/56 to on-board transceivers */ idle-state = <2>; #mux-control-cells = <0>; }; spi_mux: mux-controller-1 { compatible = "gpio-mux"; /* default on-board */ idle-state = <0>; /* * Mux switches spi bus between on-board tpm * and expansion connector (J22). */ mux-gpios = <&tca6416_u21 0 GPIO_ACTIVE_HIGH>; #mux-control-cells = <0>; }; uart3_uart4_b2b_mux: mux-controller-2 { compatible = "gpio-mux"; /* default on-board */ idle-state = <0>; /* * Mux switches both uart3 and uart4 tx/rx between expansion * connector (J22) and on-board rs232/rs485 transceivers * using one GPIO: 0 = on-board, 1 = connector. */ mux-gpios = <&tca6416_u20 0 GPIO_ACTIVE_HIGH>; #mux-control-cells = <0>; }; uart3_rs_232_485_mux: mux-controller-3 { compatible = "gpio-mux"; /* default rs232 */ idle-state = <0>; /* * Mux switches uart3 tx/rx between rs232 and rs485 * transceivers. using one GPIO: 0 = rs232, 1 = rs485. */ mux-gpios = <&tca6416_u20 1 GPIO_ACTIVE_HIGH>; #mux-control-cells = <0>; }; uart4_rs_232_485_mux: mux-controller-4 { compatible = "gpio-mux"; /* default rs232 */ idle-state = <0>; /* * Mux switches uart4 tx/rx between rs232 and rs485 * transceivers. using one GPIO: 0 = rs232, 1 = rs485. */ mux-gpios = <&tca6416_u20 2 GPIO_ACTIVE_HIGH>; #mux-control-cells = <0>; }; v_1_2: regulator-1-2 { compatible = "regulator-fixed"; regulator-name = "1v2"; regulator-max-microvolt = <1800000>; regulator-min-microvolt = <1800000>; }; reg_dsi_panel: regulator-dsi-panel { compatible = "regulator-fixed"; regulator-name = "dsi-panel"; gpios = <&tca6416_u20 15 GPIO_ACTIVE_HIGH>; regulator-max-microvolt = <11200000>; regulator-min-microvolt = <11200000>; enable-active-high; }; vmmc: regulator-mmc { compatible = "regulator-fixed"; regulator-name = "vmmc"; pinctrl-0 = <&vmmc_pins>; pinctrl-names = "default"; regulator-max-microvolt = <3300000>; regulator-min-microvolt = <3300000>; startup-delay-us = <250>; gpio = <&gpio2 19 GPIO_ACTIVE_HIGH>; enable-active-high; }; /* power for USB-A J5003 */ vbus1: regulator-vbus-1 { compatible = "regulator-fixed"; regulator-name = "vbus1"; regulator-max-microvolt = <5000000>; regulator-min-microvolt = <5000000>; gpio = <&tca6416_u20 14 GPIO_ACTIVE_HIGH>; enable-active-high; }; rfkill-m2-b-gnss { compatible = "rfkill-gpio"; /* rfkill-gpio inverts internally */ shutdown-gpios = <&tca6416_u20 10 GPIO_ACTIVE_HIGH>; label = "m2-b gnss"; radio-type = "gps"; }; rfkill-m2-b-wwan { compatible = "rfkill-gpio"; /* rfkill-gpio inverts internally */ shutdown-gpios = <&tca6416_u20 9 GPIO_ACTIVE_HIGH>; label = "m2-b radio"; radio-type = "wwan"; }; }; &ecspi2 { cs-gpios = <&gpio5 13 GPIO_ACTIVE_LOW>; num-cs = <1>; pinctrl-0 = <&ecspi2_pins>; pinctrl-names = "default"; status = "okay"; ecspi2_muxed: spi@0 { compatible = "spi-mux"; reg = <0>; #address-cells = <1>; #size-cells = <0>; mux-controls = <&spi_mux>; /* mux bandwidth is 2GHz, soc max. spi clock is 166MHz */ spi-max-frequency = <166000000>; tpm@0 { compatible = "infineon,slb9670", "tcg,tpm_tis-spi"; reg = <0>; interrupts-extended = <&tca6416_u21 9 IRQ_TYPE_LEVEL_LOW>; reset-gpios = <&tca6416_u21 1 (GPIO_ACTIVE_LOW | GPIO_OPEN_DRAIN)>; spi-max-frequency = <43000000>; }; }; }; &flexcan1 { pinctrl-0 = <&can1_pins>; pinctrl-names = "default"; status = "okay"; can-transceiver { max-bitrate = <8000000>; }; }; &flexcan2 { pinctrl-0 = <&can2_pins>; pinctrl-names = "default"; status = "okay"; can-transceiver { max-bitrate = <8000000>; }; }; &i2c2 { i2c-mux@70 { compatible = "nxp,pca9546"; reg = <0x70>; #address-cells = <1>; #size-cells = <0>; /* * This reset is open drain, * but reset core does not support GPIO_OPEN_DRAIN flag. */ reset-gpios = <&tca6416_u21 2 GPIO_ACTIVE_LOW>; /* channel 0 routed to expansion connector (J22) */ i2c_exp: i2c@0 { reg = <0>; #address-cells = <1>; #size-cells = <0>; }; /* channel 1 routed to mipi-csi connector (J23) */ i2c_csi: i2c@1 { reg = <1>; #address-cells = <1>; #size-cells = <0>; }; /* channel 2 routed to mipi-dsi connector (J25) */ i2c_dsi: i2c@2 { reg = <2>; #address-cells = <1>; #size-cells = <0>; tca6408_u48: gpio@21 { compatible = "ti,tca6408"; reg = <0x21>; #gpio-cells = <2>; gpio-controller; gpio-line-names = "CAM_RST#", "DSI_RESET", "DSI_STBYB", "DSI_PWM_BL", "DSI_L/R", "DSI_U/D", "DSI_CTP_/RST", "CAM_TRIG"; /* * reset shared between U37 and U48, to be * supported once gpio-pca953x switches to * reset framework. * * reset-gpios = <&tca6416_u21 4 * (GPIO_ACTIVE_LOW|GPIO_PULL_UP|GPIO_OPEN_DRAIN)>; */ }; }; /* channel 2 routed to lvds connector (J24) */ i2c_lvds: i2c@3 { reg = <3>; #address-cells = <1>; #size-cells = <0>; tca6408_u37: gpio@20 { compatible = "ti,tca6408"; reg = <0x20>; #gpio-cells = <2>; gpio-controller; gpio-line-names = "SELB", "LVDS_RESET", "LVDS_STBYB", "LVDS_PWM_BL", "LVDS_L/R", "LVDS_U/D", "LVDS_CTP_/RST", ""; /* * reset shared between U37 and U48, to be * supported once gpio-pca953x switches to * reset framework. * * reset-gpios = <&tca6416_u21 4 * (GPIO_ACTIVE_LOW|GPIO_PULL_UP|GPIO_OPEN_DRAIN)>; */ }; }; }; }; &i2c3 { /* highest i2c clock supported by all peripherals is 400kHz */ clock-frequency = <400000>; tca6416_u20: gpio@20 { reg = <0x20>; #gpio-cells = <2>; gpio-controller; gpio-line-names = "TCA_INT/EXT_UART", "TCA_UARTA_232/485", "TCA_UARTB_232/485", "TCA_INT/EXT_CAN", "TCA_NXP/REN", "TCA_M.2B_3V3_EN", "TCA_M.2M_3V3_EN", "TCA_M.2M_RESET#", "TCA_M.2B_RESET#", "TCA_M.2B_W_DIS#", "TCA_M.2B_GPS_EN#", "TCA_USB-HUB_RST#", "TCA_USB_HUB3_PWR_EN", "TCA_USB_HUB4_PWR_EN", "TCA_USB1_PWR_EN", "TCA_VIDEO_PWR_EN"; /* * This is a TI TCAL6416 using same programming model as * NXP PCAL6416, not to be confused with TI TCA6416. */ compatible = "nxp,pcal6416"; m2-b-reset-hog { gpios = <8 GPIO_ACTIVE_LOW>; gpio-hog; line-name = "m2-b-reset"; output-low; }; }; tca6416_u21: gpio@21 { reg = <0x21>; #interrupt-cells = <2>; interrupt-controller; #gpio-cells = <2>; gpio-controller; gpio-line-names = "TCA_SPI_TPM/EXT", "TCA_TPM_RST#", "TCA_I2C_RST", "TCA_RS232_SHTD#", "TCA_LCD_I2C_RST", "TCA_DIG_OUT1", "TCA_bDIG_IN1", "TCA_SENS_INT", "TCA_ALERT#", "TCA_TPM_PIRQ#", "TCA_RTC_INT", "TCA_M.2M_WAKW_ON_LAN", "TCA_M.2M_CLKREQ#", "TCA_LVDS_INT#", "", "TCA_POE_AT"; interrupts-extended = <&gpio1 15 IRQ_TYPE_EDGE_FALLING>; pinctrl-0 = <&tca6416_u21_int_pins>; pinctrl-names = "default"; /* * This is a TI TCAL6416 using same programming model as * NXP PCAL6416, not to be confused with TI TCA6416. */ compatible = "nxp,pcal6416"; lcd-i2c-reset-hog { gpios = <4 (GPIO_ACTIVE_LOW|GPIO_PULL_UP|GPIO_OPEN_DRAIN)>; line-name = "lcd-i2c-reset"; output-low; /* * reset shared between U37 and U48, to be * supported once gpio-pca953x switches to * reset framework. */ gpio-hog; }; m2-m-clkreq-hog { gpios = <12 GPIO_ACTIVE_LOW>; gpio-hog; input; line-name = "m2-m-clkreq"; }; rs232_shutdown: rs232-shutdown-hog { gpios = <3 GPIO_ACTIVE_LOW>; gpio-hog; line-name = "rs232-shutdown"; output-low; }; }; led-controller@30 { compatible = "ti,lp5562"; reg = <0x30>; #address-cells = <1>; #size-cells = <0>; /* use internal clock, could use external generated by rtc */ clock-mode = /bits/ 8 <1>; multi-led@0 { reg = <0x0>; #address-cells = <1>; #size-cells = <0>; color = ; label = "D7"; led@0 { reg = <0x0>; color = ; led-cur = /bits/ 8 <0x32>; max-cur = /bits/ 8 <0x64>; }; led@1 { reg = <0x1>; color = ; led-cur = /bits/ 8 <0x19>; max-cur = /bits/ 8 <0x32>; }; led@2 { reg = <0x2>; color = ; led-cur = /bits/ 8 <0x19>; max-cur = /bits/ 8 <0x32>; }; }; led@3 { reg = <0x3>; chan-name = "D8"; color = ; label = "D8"; led-cur = /bits/ 8 <0x19>; max-cur = /bits/ 8 <0x64>; }; }; light-sensor@44 { compatible = "isil,isl29023"; reg = <0x44>; /* IRQ shared between accelerometer, light-sensor and Tamper input (J5007) */ interrupts-extended = <&tca6416_u21 7 IRQ_TYPE_EDGE_FALLING>; }; accelerometer@53 { compatible = "adi,adxl345"; reg = <0x53>; /* IRQ shared between accelerometer, light-sensor and Tamper input (J5007) */ interrupts-extended = <&tca6416_u21 7 IRQ_TYPE_EDGE_FALLING>; interrupt-names = "INT1"; }; carrier_eeprom: eeprom@57 { compatible = "atmel,24c02"; reg = <0x57>; pagesize = <8>; }; carrier_rtc: rtc@69 { compatible = "abracon,ab1805"; reg = <0x69>; abracon,tc-diode = "schottky"; abracon,tc-resistor = <3>; /* * AM1805 RTC used on this board has only nTIRQ pins wired, * which is for countdown timer irqs only. * Driver does not support this, disable for now. * * interrupts-extended = <&tca6416_u21 10 IRQ_TYPE_EDGE_FALLING>; */ }; }; &iomuxc { can1_pins: pinctrl-can1-grp { fsl,pins = < MX8MP_IOMUXC_SPDIF_RX__CAN1_RX 0x154 MX8MP_IOMUXC_SPDIF_TX__CAN1_TX 0x154 >; }; can2_pins: pinctrl-can2-grp { fsl,pins = < MX8MP_IOMUXC_SAI5_MCLK__CAN2_RX 0x154 MX8MP_IOMUXC_SAI5_RXD3__CAN2_TX 0x154 >; }; ecspi2_pins: pinctrl-ecspi2-grp { fsl,pins = < MX8MP_IOMUXC_ECSPI2_SCLK__ECSPI2_SCLK 0x140 MX8MP_IOMUXC_ECSPI2_MOSI__ECSPI2_MOSI 0x140 MX8MP_IOMUXC_ECSPI2_MISO__ECSPI2_MISO 0x140 MX8MP_IOMUXC_ECSPI2_SS0__GPIO5_IO13 0x140 >; }; tca6416_u21_int_pins: pinctrl-tca6416-u21-int-grp { fsl,pins = < MX8MP_IOMUXC_GPIO1_IO15__GPIO1_IO15 0x0 >; }; /* UARTA */ uart3_pins: pinctrl-uart3-grp { fsl,pins = < MX8MP_IOMUXC_ECSPI1_SCLK__UART3_DCE_RX 0x140 MX8MP_IOMUXC_ECSPI1_MOSI__UART3_DCE_TX 0x140 MX8MP_IOMUXC_ECSPI1_SS0__GPIO5_IO09 0x140 >; }; /* UARTB */ uart4_pins: pinctrl-uart4-grp { fsl,pins = < MX8MP_IOMUXC_UART4_RXD__UART4_DCE_RX 0x140 MX8MP_IOMUXC_UART4_TXD__UART4_DCE_TX 0x140 MX8MP_IOMUXC_ECSPI1_MISO__GPIO5_IO08 0x140 >; }; usdhc2_100mhz_pins: pinctrl-usdhc2-100mhz-grp { fsl,pins = < MX8MP_IOMUXC_SD2_CLK__USDHC2_CLK 0x194 MX8MP_IOMUXC_SD2_CMD__USDHC2_CMD 0x1d4 MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0 0x1d4 MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1 0x1d4 MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2 0x1d4 MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3 0x1d4 MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT 0x140 MX8MP_IOMUXC_SD2_CD_B__USDHC2_CD_B 0x140 >; }; usdhc2_200mhz_pins: pinctrl-usdhc2-200mhz-grp { fsl,pins = < MX8MP_IOMUXC_SD2_CLK__USDHC2_CLK 0x196 MX8MP_IOMUXC_SD2_CMD__USDHC2_CMD 0x1d6 MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0 0x1d6 MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1 0x1d6 MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2 0x1d6 MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3 0x1d6 MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT 0x140 MX8MP_IOMUXC_SD2_CD_B__USDHC2_CD_B 0x140 >; }; usdhc2_pins: pinctrl-usdhc2-grp { fsl,pins = < MX8MP_IOMUXC_SD2_CLK__USDHC2_CLK 0x190 MX8MP_IOMUXC_SD2_CMD__USDHC2_CMD 0x1d0 MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0 0x1d0 MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1 0x1d0 MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2 0x1d0 MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3 0x1d0 MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT 0x140 MX8MP_IOMUXC_SD2_CD_B__USDHC2_CD_B 0x140 >; }; vmmc_pins: pinctrl-vmmc-grp { fsl,pins = < MX8MP_IOMUXC_SD2_RESET_B__GPIO2_IO19 0x0 >; }; }; &pcie { reset-gpio = <&tca6416_u20 7 GPIO_ACTIVE_LOW>; status = "okay"; }; /* M.2 M-Key (J4) */ &pcie_phy { clocks = <&hsio_blk_ctrl>; clock-names = "ref"; fsl,clkreq-unsupported; fsl,refclk-pad-mode = ; status = "okay"; }; &phy0 { leds { #address-cells = <1>; #size-cells = <0>; /* ADIN1300 LED_0 pin */ led@0 { reg = <0>; color = ; default-state = "keep"; function = LED_FUNCTION_LAN; }; }; }; &phy1 { leds { #address-cells = <1>; #size-cells = <0>; /* ADIN1300 LED_0 pin */ led@0 { reg = <0>; color = ; default-state = "keep"; function = LED_FUNCTION_LAN; }; }; }; &uart3 { assigned-clock-parents = <&clk IMX8MP_SYS_PLL1_80M>; /* select 80MHz parent clock to support maximum baudrate 4Mbps */ assigned-clocks = <&clk IMX8MP_CLK_UART3>; pinctrl-0 = <&uart3_pins>; pinctrl-names = "default"; rts-gpios = <&gpio5 9 GPIO_ACTIVE_HIGH>; status = "okay"; }; &uart4 { assigned-clock-parents = <&clk IMX8MP_SYS_PLL1_80M>; /* select 80MHz parent clock to support maximum baudrate 4Mbps */ assigned-clocks = <&clk IMX8MP_CLK_UART4>; pinctrl-0 = <&uart4_pins>; pinctrl-names = "default"; rts-gpios = <&gpio5 8 GPIO_ACTIVE_HIGH>; status = "okay"; }; &usb3_0 { status = "okay"; }; &usb3_1 { status = "okay"; }; &usb3_phy0 { vbus-supply = <&vbus1>; fsl,phy-tx-preemp-amp-tune-microamp = <1200>; status = "okay"; }; &usb3_phy1 { status = "okay"; }; &usb_dwc3_0 { dr_mode = "host"; }; &usb_dwc3_1 { #address-cells = <1>; #size-cells = <0>; dr_mode = "host"; hub_2_0: hub@1 { compatible = "usb4b4,6502", "usb4b4,6506"; reg = <1>; peer-hub = <&hub_3_0>; reset-gpios = <&tca6416_u20 11 GPIO_ACTIVE_LOW>; vdd2-supply = <&v_3_3>; vdd-supply = <&v_1_2>; }; hub_3_0: hub@2 { compatible = "usb4b4,6500", "usb4b4,6504"; reg = <2>; peer-hub = <&hub_2_0>; reset-gpios = <&tca6416_u20 11 GPIO_ACTIVE_LOW>; vdd2-supply = <&v_3_3>; vdd-supply = <&v_1_2>; }; }; &usdhc2 { bus-width = <4>; cap-power-off-card; full-pwr-cycle; pinctrl-0 = <&usdhc2_pins>; pinctrl-1 = <&usdhc2_100mhz_pins>; pinctrl-2 = <&usdhc2_200mhz_pins>; pinctrl-names = "default", "state_100mhz", "state_200mhz"; vmmc-supply = <&vmmc>; status = "okay"; };