How iomuxc and gpio are linked in imx7 device trees?

Dear All,

  1. How iomuxc node is mapped to gpio node in imx7s.dtsi, imx7-colibri.dtsi? I would also like to know address calculation, etc.

    	aips1: aips-bus@30000000 {
    		compatible = "fsl,aips-bus", "simple-bus";
    		#address-cells = <1>;
    		#size-cells = <1>;
    		reg = <0x30000000 0x400000>;
    		ranges;
    
    		gpio1: gpio@30200000 {
    			compatible = "fsl,imx7d-gpio", "fsl,imx35-gpio";
    			reg = <0x30200000 0x10000>;
    			interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>, /* GPIO1_INT15_0 */
    				     <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>; /* GPIO1_INT31_16 */
    			gpio-controller;
    			#gpio-cells = <2>;
    			interrupt-controller;
    			#interrupt-cells = <2>;
    			gpio-ranges = <&iomuxc_lpsr 0 0 8>, <&iomuxc 8 5 8>;
    		};
    
    		gpio2: gpio@30210000 {
    			compatible = "fsl,imx7d-gpio", "fsl,imx35-gpio";
    			reg = <0x30210000 0x10000>;
    			interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>,
    				     <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
    			gpio-controller;
    			#gpio-cells = <2>;
    			interrupt-controller;
    			#interrupt-cells = <2>;
    			gpio-ranges = <&iomuxc 0 13 32>;
    		};
    

  2. Why does iomuxc reference node in imx7-colibri.dtsi show less pin definitions in gpio sections than actually available in the gpio nodes?

    &iomuxc {
    pinctrl-names = “default”;
    pinctrl-0 = <&pinctrl_gpio1 &pinctrl_gpio2 &pinctrl_gpio3 &pinctrl_gpio4
    &pinctrl_gpio5 &pinctrl_gpio6 &pinctrl_gpio7>;

    pinctrl_gpio1: gpio1-grp {
    	fsl,pins = <
    		MX7D_PAD_SAI1_RX_SYNC__GPIO6_IO16	0x14 /* SODIMM 77 */
    		MX7D_PAD_EPDC_DATA09__GPIO2_IO9		0x14 /* SODIMM 89 */
    		MX7D_PAD_EPDC_DATA08__GPIO2_IO8		0x74 /* SODIMM 91 */
    		MX7D_PAD_LCD_RESET__GPIO3_IO4		0x14 /* SODIMM 93 */
    		MX7D_PAD_EPDC_DATA13__GPIO2_IO13	0x14 /* SODIMM 95 */
    		MX7D_PAD_ENET1_RGMII_TXC__GPIO7_IO11	0x14 /* SODIMM 99 */
    		MX7D_PAD_EPDC_DATA10__GPIO2_IO10	0x74 /* SODIMM 105 */
    		MX7D_PAD_EPDC_DATA00__GPIO2_IO0		0x14 /* SODIMM 111 */
    		MX7D_PAD_EPDC_DATA01__GPIO2_IO1		0x14 /* SODIMM 113 */
    		MX7D_PAD_EPDC_DATA02__GPIO2_IO2		0x14 /* SODIMM 115 */
    		MX7D_PAD_EPDC_DATA03__GPIO2_IO3		0x14 /* SODIMM 117 */
    		MX7D_PAD_EPDC_DATA04__GPIO2_IO4		0x14 /* SODIMM 119 */
    		MX7D_PAD_EPDC_DATA05__GPIO2_IO5		0x14 /* SODIMM 121 */
    		MX7D_PAD_EPDC_DATA06__GPIO2_IO6		0x14 /* SODIMM 123 */
    		MX7D_PAD_EPDC_DATA07__GPIO2_IO7		0x14 /* SODIMM 125 */
    		MX7D_PAD_EPDC_SDCE2__GPIO2_IO22		0x14 /* SODIMM 127 */
    		MX7D_PAD_UART3_RTS_B__GPIO4_IO6		0x14 /* SODIMM 131 */
    		MX7D_PAD_EPDC_GDRL__GPIO2_IO26		0x14 /* SODIMM 133 */
    		MX7D_PAD_SAI1_RX_DATA__GPIO6_IO12	0x14 /* SODIMM 169 */
    		MX7D_PAD_SAI1_RX_BCLK__GPIO6_IO17	0x14 /* SODIMM 24 */
    		MX7D_PAD_SD2_DATA2__GPIO5_IO16		0x14 /* SODIMM 100 */
    		MX7D_PAD_SD2_DATA3__GPIO5_IO17		0x14 /* SODIMM 102 */
    		MX7D_PAD_EPDC_GDSP__GPIO2_IO27		0x14 /* SODIMM 104 */
    		MX7D_PAD_EPDC_BDR1__GPIO2_IO29		0x14 /* SODIMM 110 */
    		MX7D_PAD_EPDC_PWR_COM__GPIO2_IO30	0x14 /* SODIMM 112 */
    		MX7D_PAD_EPDC_SDCLK__GPIO2_IO16		0x14 /* SODIMM 114 */
    		MX7D_PAD_EPDC_SDLE__GPIO2_IO17		0x14 /* SODIMM 116 */
    		MX7D_PAD_EPDC_SDOE__GPIO2_IO18		0x14 /* SODIMM 118 */
    		MX7D_PAD_EPDC_SDSHR__GPIO2_IO19		0x14 /* SODIMM 120 */
    		MX7D_PAD_EPDC_SDCE0__GPIO2_IO20		0x14 /* SODIMM 122 */
    		MX7D_PAD_EPDC_SDCE1__GPIO2_IO21		0x14 /* SODIMM 124 */
    		MX7D_PAD_EPDC_DATA14__GPIO2_IO14	0x14 /* SODIMM 126 */
    		MX7D_PAD_EPDC_PWR_STAT__GPIO2_IO31	0x14 /* SODIMM 128 */
    		MX7D_PAD_EPDC_SDCE3__GPIO2_IO23		0x14 /* SODIMM 130 */
    		MX7D_PAD_EPDC_GDCLK__GPIO2_IO24		0x14 /* SODIMM 132 */
    		MX7D_PAD_EPDC_GDOE__GPIO2_IO25		0x14 /* SODIMM 134 */
    		MX7D_PAD_EPDC_DATA12__GPIO2_IO12	0x14 /* SODIMM 150 */
    		MX7D_PAD_EPDC_DATA11__GPIO2_IO11	0x14 /* SODIMM 152 */
    		MX7D_PAD_SD2_CLK__GPIO5_IO12		0x14 /* SODIMM 184 */
    		MX7D_PAD_SD2_CMD__GPIO5_IO13		0x14 /* SODIMM 186 */
    	>;
    };
    
    pinctrl_gpio2: gpio2-grp { /* On X22 Camera interface */
    	fsl,pins = <
    		MX7D_PAD_SD1_CD_B__GPIO5_IO0		0x74 /* SODIMM 69 */
    		MX7D_PAD_I2C4_SDA__GPIO4_IO15		0x14 /* SODIMM 75 */
    		MX7D_PAD_ECSPI1_MISO__GPIO4_IO18	0x14 /* SODIMM 79 */
    		MX7D_PAD_I2C3_SCL__GPIO4_IO12		0x14 /* SODIMM 81 */
    		MX7D_PAD_ECSPI2_MISO__GPIO4_IO22	0x14 /* SODIMM 85 */
    		MX7D_PAD_ECSPI1_SS0__GPIO4_IO19		0x14 /* SODIMM 97 */
    		MX7D_PAD_ECSPI1_SCLK__GPIO4_IO16	0x14 /* SODIMM 101 */
    		MX7D_PAD_ECSPI1_MOSI__GPIO4_IO17	0x14 /* SODIMM 103 */
    		MX7D_PAD_I2C3_SDA__GPIO4_IO13		0x14 /* SODIMM 94 */
    		MX7D_PAD_I2C4_SCL__GPIO4_IO14		0x14 /* SODIMM 96 */
    		MX7D_PAD_SD2_RESET_B__GPIO5_IO11	0x14 /* SODIMM 98 */
    	>;
    };
    
    pinctrl_gpio3: gpio3-grp { /* LCD 18-23 */
    	fsl,pins = <
    		MX7D_PAD_LCD_DATA18__GPIO3_IO23		0x14 /* SODIMM 136 */
    		MX7D_PAD_LCD_DATA19__GPIO3_IO24		0x14 /* SODIMM 138 */
    		MX7D_PAD_LCD_DATA20__GPIO3_IO25		0x14 /* SODIMM 140 */
    		MX7D_PAD_LCD_DATA21__GPIO3_IO26		0x14 /* SODIMM 142 */
    		MX7D_PAD_LCD_DATA22__GPIO3_IO27		0x74 /* SODIMM 144 */
    		MX7D_PAD_LCD_DATA23__GPIO3_IO28		0x74 /* SODIMM 146 */
    	>;
    };
    
    pinctrl_gpio4: gpio4-grp { /* Alternatively CAN2 */
    	fsl,pins = <
    		MX7D_PAD_GPIO1_IO15__GPIO1_IO15		0x14 /* SODIMM 178 */
    		MX7D_PAD_GPIO1_IO14__GPIO1_IO14		0x14 /* SODIMM 188 */
    	>;
    };
    
    pinctrl_gpio5: spigpios {
    	fsl,pins = <
    		/* CS1 */
    		MX7D_PAD_ECSPI2_SS0__GPIO4_IO23		0x74 /* SODIMM 65 */
    	 >;
    };
    
    pinctrl_gpio6: gpio6-grp { /* ATMEL MXT TOUCH */
    	fsl,pins = <
    		MX7D_PAD_EPDC_DATA15__GPIO2_IO15	0x74 /* SODIMM 107 */
    		MX7D_PAD_EPDC_BDR0__GPIO2_IO28		0x74 /* SODIMM 106 */
    	>;
    };
    
    pinctrl_gpio7: gpio7-grp { /* Alternatively CAN1 */
    	fsl,pins = <
    		MX7D_PAD_ENET1_RGMII_RD3__GPIO7_IO3	0x14 /* SODIMM 55 */
    		MX7D_PAD_ENET1_RGMII_RD2__GPIO7_IO2	0x14 /* SODIMM 63 */
    	>;
    };
    

Regards

Welcome to the Community.

  1. You do not need to do the address calculation. it is already done in the device tree file.
  2. Every pin can be muxed either to gpio or something else. and one doesn’t need gpio node for every gpio.

For more information about addressing and pin muxing see these documents of i.MX7Solo from NXP.