This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

SN65DSI86: Linux driver throws error during bridge probe with message "failed to parse regulators"

Part Number: SN65DSI86


I am using a Digi ConnectCore 8M Nano SoM on a carrier board that has the SN65DSI86 MIPI-DSI-to-eDP bridge. 

I used the reference bindings example which can be found here:

https://www.kernel.org/doc/Documentation/devicetree/bindings/display/bridge/ti%2Csn65dsi86.txt

I am compiling in the ti-sn65dsi86 kernel driver which is part of the mainline Linux kernel; specifically, I am using a Digi specific fork of the Linux kernel that contains this driver which can be found here:

https://github.com/digi-embedded/linux/blob/v5.4/dey-3.2/maint/drivers/gpu/drm/bridge/ti-sn65dsi86.c

I am getting the following error:

the following is a snippet of the regulator property definitions inside of my bridge node in my device tree:

		vcca-supply = <&reg_1v2_ext>;
		vcc-supply = <&reg_1v2_ext>;
		vccio-supply = <&reg_1v8_ext>;
		vpll-supply = <&reg_1v8_ext>;

Here's a snippet of my regulator definitions for those particular regulators (a brief note: the "regulators" contains other regulators that I did not provide within the snippet, hence 1v2 starting @8 and 1v8 starting @2):

	regulators {
		compatible = "simple-bus";
		#address-cells = <1>;
		#size-cells = <0>;

        ...
        
		reg_1v8_ext: regulator@2 {
			compatible = "regulator-fixed";
			reg = <2>;
			regulator-name = "1v8_ext";
			regulator-min-microvolt = <1800000>;
			regulator-max-microvolt = <1800000>;
			gpio = <&mca_gpio 14 GPIO_ACTIVE_HIGH>;
			enable-active-high;
			regulator-always-on;
			regulator-boot-on;
		};
		
		...
		
		reg_1v2_ext: regulator@8 {
			compatible = "regulator-fixed";
			reg = <8>;
			regulator-name = "1v2_ext";
			regulator-min-microvolt = <1200000>;
			regulator-max-microvolt = <1200000>;
			regulator-always-on;
			regulator-boot-on;
		};
	};


As a note, the 1v2 and 1v8 come from an on-board, always on, LDO.

I'm wondering why I'm seeing this error. Taking a closer look at the driver at ti-sn65dsi86.c Line 747, we see the error gets thrown when calling ti_sn_bridge_parse_regulators()

    ret = ti_sn_bridge_parse_regulators(pdata);
    if (ret) {
        DRM_ERROR("failed to parse regulators\n");
        return ret;
    }

Looking at what this function does, we take a peak inside ti_sn_bridge_parse_regulators():

static int ti_sn_bridge_parse_regulators(struct ti_sn_bridge *pdata)
{
    unsigned int i;
    const char * const ti_sn_bridge_supply_names[] = {
        "vcca", "vcc", "vccio", "vpll",
    };
    for (i = 0; i < SN_REGULATOR_SUPPLY_NUM; i++)
        pdata->supplies[i].supply = ti_sn_bridge_supply_names[i];
    return devm_regulator_bulk_get(pdata->dev, SN_REGULATOR_SUPPLY_NUM,
                       pdata->supplies);
}

Nothing to exotic there -- I see we are simply getting the regulator properties via regulator_bulk_data() which is called within devm_regulator_bulk_get()

So I'm wondering what I'm missing here -- consequently, since this fails, the dsi binding fails as well and as a result, I see nothing on my display:

As an additional note, I have already verified that the bridge itself and the hardware & schematic are correct. I was able to use the Excel SN65DSI86 Register Calculator and I was able to program the bridge via Aardvark to generate a color bar test pattern. The Display successfully turned on and showed the test pattern.

Thank you!