Devicetree imx8xqxp

I’m working on a devicetree for colibri imx8qxp module attached to a Toradex colibri-evaluation board 3.2. What Im trying to do is to enable i2c on SODIMM 23 and SODIM 138. The final solution will have an rtc (pt7c4339) connected to the pins.

pin functionality is set with.

&iomuxc { 

/* Colibri I2C2 */ 
pinctrl_i2c2: i2c2grp { 
fsl,pins = < 
IMX8QXP_MIPI_DSI1_GPIO0_01_ADMA_I2C2_SDA 0x6000061 /* SODIMM  23 */ 
IMX8QXP_MIPI_DSI1_GPIO0_00_ADMA_I2C2_SCL 0x6000061 /* SODIMM 138 */ 
; 
}; 

When I run I2c detect a new i2c bus is discovered i2c-18

i2cdetect -l 
i2c-17 i2c       5a810000.i2c                    I2C adapter 
i2c-18 i2c       5a820000.i2c                    I2C adapter 
i2c-16 i2c       5a800000.i2c                    I2C adapter 

I try to measure with a logic analyzer on pin 23 and 138. I expect to get a request but I get nothing.

i2cdump -r 0-0xf 18 0x68 b

Here is the complete devicetree imx8x-colibri-eval-v3.dtsi that is built with yocto toradex 5.4.0

// SPDX-License-Identifier: GPL-2.0+ OR X11
/*
 * Copyright 2018-2021 Toradex
 */

/ {
	aliases {
		/* rtc0 = &rtc_i2c; */
		rtc0 = &rtc_pt7c4339;
		rtc1 = &rtc;
	};

	/* fixed crystal dedicated to mcp25xx */
	clk16m: clock-16mhz-fixed {
		compatible = "fixed-clock";
		#clock-cells = <0>;
		clock-frequency = <16000000>;
	};

	extcon_usbc_det: usbc_det {
		compatible = "linux,extcon-usb-gpio";
		debounce = <25>;
		id-gpio = <&lsio_gpio5 9 GPIO_ACTIVE_HIGH>;
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_usbc_det>;
	};

	reg_3v3: regulator-3v3 {
		compatible = "regulator-fixed";
		regulator-name = "3.3V";
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
	};

	reg_usbh_vbus: regulator-usbh-vbus {
		compatible = "regulator-fixed";
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_usbh1_reg>;
		regulator-name = "usbh_vbus";
		regulator-min-microvolt = <5000000>;
		regulator-max-microvolt = <5000000>;
		gpio = <&lsio_gpio4 3 GPIO_ACTIVE_LOW>;
		regulator-always-on;
	};
};

/* Colibri Analogue Inputs */
&adc0 {
	status = "okay";
};

/* Colibri PWM_A */
&adma_pwm {
	status = "okay";
};

/* Colibri FastEthernet */
&fec1 {
	status = "okay";
};

/* Colibri I2C */
&i2c1 {
	status = "okay";

	/* M41T0M6 real time clock on carrier board */
	rtc_i2c: rtc@68 {
		compatible = "st,m41t0";
		reg = <0x68>;
	};
};

&dma_subsys {
	i2c_rpbus_2: i2c_rpbus_2 {
		compatible = "fsl,i2c-rpbus";
		#address-cells = <1>;
		#size-cells = <0>;
		status = "okay";
	};
};

 &i2c2 {

	#address-cells = <1>;
	#size-cells = <0>;
	clock-frequency = <100000>;
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_i2c2>;
	status = "okay";

	/* PT7C4339 real time clock */
	rtc_pt7c4339: rtc_pt7c4339@68 {
		compatible = "pericom,pt7c4339";
		reg = <0x68>;
	};
};

&iomuxc {

	/* Colibri I2C2 */
	pinctrl_i2c2: i2c2grp {
		fsl,pins = <
			IMX8QXP_MIPI_DSI1_GPIO0_01_ADMA_I2C2_SDA 	0x6000061 		/* SODIMM  23 */
			IMX8QXP_MIPI_DSI1_GPIO0_00_ADMA_I2C2_SCL	0x6000061		/* SODIMM 138 */
		>;
	};
};

&jpegdec {
	status = "okay";
};

&jpegenc {
	status = "okay";
};

/* Colibri SPI */
&lpspi2 {
	mcp2515: can@0 {
		compatible = "microchip,mcp2515";
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_can_int>;
		reg = <0>;
		clocks = <&clk16m>;
		interrupt-parent = <&lsio_gpio3>;
		interrupts = <13 IRQ_TYPE_EDGE_FALLING>;
		spi-max-frequency = <10000000>;
		status = "okay";
	};
	/* To keep the CAN controller enabled by default,
	 * disable conflicting spidev. This spidev device
	 * enables with the devicetree overlay.
	 */
	spidev0: spidev@0 {
		status = "disabled";
	};
};

/* Colibri UART_B */
&lpuart0 {
	status = "disabled";
};

/* Colibri UART_C */
&lpuart2 {
	status = "disabled";
};

/* Colibri UART_A */
&lpuart3 {
	status = "disabled";
};

&lsio_gpio3 {
	/*
	 * Add GPIO3_10 as a wakeup source:
	 * Pin:  157	SC_P_QSPI0A_DATA1 (SODIMM_45)
	 * Type: 6	SC_PAD_WAKEUP_RISE_EDGE
	 * Line: 10	GPIO3_IO10
	 */
	pad-wakeup = <IMX8QXP_QSPI0A_DATA1 6 10>;
	pad-wakeup-num = <1>;
 };

/* Colibri PWM_B */
&pwm0 {
	status = "okay";
};

/* Colibri PWM_C */
&pwm1 {
	status = "okay";
};

/* Colibri PWM_D */
&pwm2 {
	status = "okay";
};

/* USB PHY for &usbotg3 */
&usb3phynop1 {
	status = "okay";
};

&usbotg1 {
	extcon = <&extcon_usbc_det &extcon_usbc_det>;
	vbus-supply = <&reg_usbh_vbus>;
	srp-disable;
	hnp-disable;
	adp-disable;
	power-active-high;
	disable-over-current;
	status = "okay";
};

&usbotg3 {
	dr_mode = "host";
	status = "okay";
};

/* USB PHY for &usbotg1 */
&usbphy1 {
	status = "okay";
};

/* Colibri SD/MMC Card */
&usdhc2 {
	status = "okay";
};

&vpu_decoder {
	status = "okay";
};

&vpu_encoder {
	status = "okay";
};

&vpu_lpcg {
	status = "okay";
};

Hello @petan96,

Sorry for the delay in answering your question.
As you already know, the rtc driver for pt7c4339 needs to be enabled for this to work. Unfortunately, our ostree files do not provide the driver support for pt7c4339. It is possible that the driver for pt7c4338 might work with pt7c4339. Could you please give it a quick try by enabling the driver for pt7c4338 instead?
Furthermore, could you please also indicate the version of your colibri iMX8QXP module?

Hello rudi.tx

Thanks for your answer.

I discovered a bug in my devicetree that solved the problem. There is a missing level in &iomux. I’m working on a driver now and the registers for pt7c4339 is almost the same as the driver for ds1307.

The final devicetree that works (can send i2c commands to rtc) looks like this.

// SPDX-License-Identifier: GPL-2.0+ OR X11
/*
 * Copyright 2018-2021 Toradex
 */

/ {
	aliases {
		rtc0 = &rtc_i2c;
		rtc1 = &rtc;
		rtc2 = &rtc_pt7c4339;
	};

	/* fixed crystal dedicated to mcp25xx */
	clk16m: clock-16mhz-fixed {
		compatible = "fixed-clock";
		#clock-cells = <0>;
		clock-frequency = <16000000>;
	};

	extcon_usbc_det: usbc_det {
		compatible = "linux,extcon-usb-gpio";
		debounce = <25>;
		id-gpio = <&lsio_gpio5 9 GPIO_ACTIVE_HIGH>;
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_usbc_det>;
	};

	reg_3v3: regulator-3v3 {
		compatible = "regulator-fixed";
		regulator-name = "3.3V";
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
	};

	reg_usbh_vbus: regulator-usbh-vbus {
		compatible = "regulator-fixed";
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_usbh1_reg>;
		regulator-name = "usbh_vbus";
		regulator-min-microvolt = <5000000>;
		regulator-max-microvolt = <5000000>;
		gpio = <&lsio_gpio4 3 GPIO_ACTIVE_LOW>;
		regulator-always-on;
	};
};

/* Colibri Analogue Inputs */
&adc0 {
	status = "okay";
};

/* Colibri PWM_A */
&adma_pwm {
	status = "okay";
};

/* Colibri FastEthernet */
&fec1 {
	status = "okay";
};

/* Colibri I2C */
&i2c1 {
	status = "okay";

	/* M41T0M6 real time clock on carrier board */
	rtc_i2c: rtc@68 {
		compatible = "st,m41t0";
		reg = <0x68>;
	};
};

&i2c2 {

	#address-cells = <1>;
	#size-cells = <0>;
	clock-frequency = <100000>;
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_i2c2>;
	status = "okay";

	/* PT7C4339 real time clock */
	rtc_pt7c4339: rtc_pt7c4339@68 {
		compatible = "pericom,pt7c4339";
		reg = <0x68>;
	};
};

&iomuxc {
	colibri-imx8qxp {
		/* Colibri I2C2 */
		pinctrl_i2c2: i2c2grp {
		fsl,pins = <
			IMX8QXP_MIPI_DSI1_GPIO0_01_ADMA_I2C2_SDA 	0x06000061 		/* SODIMM  23 */
			IMX8QXP_MIPI_DSI1_GPIO0_00_ADMA_I2C2_SCL	0x06000061		/* SODIMM 138 */
		>;
		};
	};
};

&jpegdec {
	status = "okay";
};

&jpegenc {
	status = "okay";
};

/* Colibri SPI */
&lpspi2 {
	mcp2515: can@0 {
		compatible = "microchip,mcp2515";
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_can_int>;
		reg = <0>;
		clocks = <&clk16m>;
		interrupt-parent = <&lsio_gpio3>;
		interrupts = <13 IRQ_TYPE_EDGE_FALLING>;
		spi-max-frequency = <10000000>;
		status = "okay";
	};
	/* To keep the CAN controller enabled by default,
	 * disable conflicting spidev. This spidev device
	 * enables with the devicetree overlay.
	 */
	spidev0: spidev@0 {
		status = "disabled";
	};
};

/* Colibri UART_B */
&lpuart0 {
	status = "disabled";
};

/* Colibri UART_C */
&lpuart2 {
	status = "disabled";
};

/* Colibri UART_A */
&lpuart3 {
	status = "disabled";
};

&lsio_gpio3 {
	/*
	 * Add GPIO3_10 as a wakeup source:
	 * Pin:  157	SC_P_QSPI0A_DATA1 (SODIMM_45)
	 * Type: 6	SC_PAD_WAKEUP_RISE_EDGE
	 * Line: 10	GPIO3_IO10
	 */
	pad-wakeup = <IMX8QXP_QSPI0A_DATA1 6 10>;
	pad-wakeup-num = <1>;
 };

/* Colibri PWM_B */
&pwm0 {
	status = "okay";
};

/* Colibri PWM_C */
&pwm1 {
	status = "okay";
};

/* Colibri PWM_D */
&pwm2 {
	status = "okay";
};

/* USB PHY for &usbotg3 */
&usb3phynop1 {
	status = "okay";
};

&usbotg1 {
	extcon = <&extcon_usbc_det &extcon_usbc_det>;
	vbus-supply = <&reg_usbh_vbus>;
	srp-disable;
	hnp-disable;
	adp-disable;
	power-active-high;
	disable-over-current;
	status = "okay";
};

&usbotg3 {
	dr_mode = "host";
	status = "okay";
};

/* USB PHY for &usbotg1 */
&usbphy1 {
	status = "okay";
};

/* Colibri SD/MMC Card */
&usdhc2 {
	status = "okay";
};

&vpu_decoder {
	status = "okay";
};

&vpu_encoder {
	status = "okay";
};

&vpu_lpcg {
	status = "okay";
};

Hello @petan96,

Glad to hear that you could solve the issue and also thanks for sharing the solution with us. Have a good day!