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.

TDA4VM: I want to light up the screen using panel-simple.c, but there is no signal output from the DSI.

Part Number: TDA4VM

Tool/software:

Hello TI

The SDK version I'm using is TDA4VM_SDK_10.05. I want to use the file psdkla/board-support/ti-linux-kernel-6.6.32+git-ti/drivers/gpu/drm/panel/panel-simple.c to configure the DSI.

However, there is no signal output from the DSI.The panel_simple_dsi_probe function has not been successfully probed either. The modified panel-simple.c is as follows.

/*
 * Copyright (C) 2013, NVIDIA Corporation.  All rights reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sub license,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the
 * next paragraph) shall be included in all copies or substantial portions
 * of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

#include <linux/delay.h>
#include <linux/gpio/consumer.h>
#include <linux/i2c.h>
#include <linux/media-bus-format.h>
#include <linux/module.h>
#include <linux/of_platform.h>
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
#include <linux/regulator/consumer.h>

#include <video/display_timing.h>
#include <video/of_display_timing.h>
#include <video/videomode.h>

#include <drm/drm_crtc.h>
#include <drm/drm_device.h>
#include <drm/drm_edid.h>
#include <drm/drm_mipi_dsi.h>
#include <drm/drm_panel.h>

/**
 * struct panel_desc - Describes a simple panel.
 */
struct panel_desc {
	/**
	 * @modes: Pointer to array of fixed modes appropriate for this panel.
	 *
	 * If only one mode then this can just be the address of the mode.
	 * NOTE: cannot be used with "timings" and also if this is specified
	 * then you cannot override the mode in the device tree.
	 */
	const struct drm_display_mode *modes;

	/** @num_modes: Number of elements in modes array. */
	unsigned int num_modes;

	/**
	 * @timings: Pointer to array of display timings
	 *
	 * NOTE: cannot be used with "modes" and also these will be used to
	 * validate a device tree override if one is present.
	 */
	const struct display_timing *timings;

	/** @num_timings: Number of elements in timings array. */
	unsigned int num_timings;

	/** @bpc: Bits per color. */
	unsigned int bpc;

	/** @size: Structure containing the physical size of this panel. */
	struct {
		/**
		 * @size.width: Width (in mm) of the active display area.
		 */
		unsigned int width;

		/**
		 * @size.height: Height (in mm) of the active display area.
		 */
		unsigned int height;
	} size;

	/** @delay: Structure containing various delay values for this panel. */
	struct {
		/**
		 * @delay.prepare: Time for the panel to become ready.
		 *
		 * The time (in milliseconds) that it takes for the panel to
		 * become ready and start receiving video data
		 */
		unsigned int prepare;

		/**
		 * @delay.enable: Time for the panel to display a valid frame.
		 *
		 * The time (in milliseconds) that it takes for the panel to
		 * display the first valid frame after starting to receive
		 * video data.
		 */
		unsigned int enable;

		/**
		 * @delay.disable: Time for the panel to turn the display off.
		 *
		 * The time (in milliseconds) that it takes for the panel to
		 * turn the display off (no content is visible).
		 */
		unsigned int disable;

		/**
		 * @delay.unprepare: Time to power down completely.
		 *
		 * The time (in milliseconds) that it takes for the panel
		 * to power itself down completely.
		 *
		 * This time is used to prevent a future "prepare" from
		 * starting until at least this many milliseconds has passed.
		 * If at prepare time less time has passed since unprepare
		 * finished, the driver waits for the remaining time.
		 */
		unsigned int unprepare;
	} delay;

	/** @bus_format: See MEDIA_BUS_FMT_... defines. */
	u32 bus_format;

	/** @bus_flags: See DRM_BUS_FLAG_... defines. */
	u32 bus_flags;

	/** @connector_type: LVDS, eDP, DSI, DPI, etc. */
	int connector_type;
};

struct panel_simple {
	struct drm_panel base;
	bool enabled;

	bool prepared;

	ktime_t unprepared_time;

	const struct panel_desc *desc;

	struct regulator *supply;
	struct i2c_adapter *ddc;

	struct gpio_desc *enable_gpio;

	struct edid *edid;

	struct drm_display_mode override_mode;

	enum drm_panel_orientation orientation;
};

static inline struct panel_simple *to_panel_simple(struct drm_panel *panel)
{
	return container_of(panel, struct panel_simple, base);
}

static unsigned int panel_simple_get_timings_modes(struct panel_simple *panel,
						   struct drm_connector *connector)
{
	struct drm_display_mode *mode;
	unsigned int i, num = 0;

	for (i = 0; i < panel->desc->num_timings; i++) {
		const struct display_timing *dt = &panel->desc->timings[i];
		struct videomode vm;

		videomode_from_timing(dt, &vm);
		mode = drm_mode_create(connector->dev);
		if (!mode) {
			dev_err(panel->base.dev, "failed to add mode %ux%u\n",
				dt->hactive.typ, dt->vactive.typ);
			continue;
		}

		drm_display_mode_from_videomode(&vm, mode);

		mode->type |= DRM_MODE_TYPE_DRIVER;

		if (panel->desc->num_timings == 1)
			mode->type |= DRM_MODE_TYPE_PREFERRED;

		drm_mode_probed_add(connector, mode);
		num++;
	}

	return num;
}

static unsigned int panel_simple_get_display_modes(struct panel_simple *panel,
						   struct drm_connector *connector)
{
	struct drm_display_mode *mode;
	unsigned int i, num = 0;

	for (i = 0; i < panel->desc->num_modes; i++) {
		const struct drm_display_mode *m = &panel->desc->modes[i];

		mode = drm_mode_duplicate(connector->dev, m);
		if (!mode) {
			dev_err(panel->base.dev, "failed to add mode %ux%u@%u\n",
				m->hdisplay, m->vdisplay,
				drm_mode_vrefresh(m));
			continue;
		}

		mode->type |= DRM_MODE_TYPE_DRIVER;

		if (panel->desc->num_modes == 1)
			mode->type |= DRM_MODE_TYPE_PREFERRED;

		drm_mode_set_name(mode);

		drm_mode_probed_add(connector, mode);
		num++;
	}

	return num;
}

static int panel_simple_get_non_edid_modes(struct panel_simple *panel,
					   struct drm_connector *connector)
{
	struct drm_display_mode *mode;
	bool has_override = panel->override_mode.type;
	unsigned int num = 0;

	if (!panel->desc)
		return 0;

	if (has_override) {
		mode = drm_mode_duplicate(connector->dev,
					  &panel->override_mode);
		if (mode) {
			drm_mode_probed_add(connector, mode);
			num = 1;
		} else {
			dev_err(panel->base.dev, "failed to add override mode\n");
		}
	}

	/* Only add timings if override was not there or failed to validate */
	if (num == 0 && panel->desc->num_timings)
		num = panel_simple_get_timings_modes(panel, connector);

	/*
	 * Only add fixed modes if timings/override added no mode.
	 *
	 * We should only ever have either the display timings specified
	 * or a fixed mode. Anything else is rather bogus.
	 */
	WARN_ON(panel->desc->num_timings && panel->desc->num_modes);
	if (num == 0)
		num = panel_simple_get_display_modes(panel, connector);

	connector->display_info.bpc = panel->desc->bpc;
	connector->display_info.width_mm = panel->desc->size.width;
	connector->display_info.height_mm = panel->desc->size.height;
	if (panel->desc->bus_format)
		drm_display_info_set_bus_formats(&connector->display_info,
						 &panel->desc->bus_format, 1);
	connector->display_info.bus_flags = panel->desc->bus_flags;

	return num;
}

static void panel_simple_wait(ktime_t start_ktime, unsigned int min_ms)
{
	ktime_t now_ktime, min_ktime;

	if (!min_ms)
		return;

	min_ktime = ktime_add(start_ktime, ms_to_ktime(min_ms));
	now_ktime = ktime_get_boottime();

	if (ktime_before(now_ktime, min_ktime))
		msleep(ktime_to_ms(ktime_sub(min_ktime, now_ktime)) + 1);
}

static int panel_simple_disable(struct drm_panel *panel)
{
	struct panel_simple *p = to_panel_simple(panel);

	if (!p->enabled)
		return 0;

	if (p->desc->delay.disable)
		msleep(p->desc->delay.disable);

	p->enabled = false;

	return 0;
}

static int panel_simple_suspend(struct device *dev)
{
	struct panel_simple *p = dev_get_drvdata(dev);

	gpiod_set_value_cansleep(p->enable_gpio, 0);
	regulator_disable(p->supply);
	p->unprepared_time = ktime_get_boottime();

	kfree(p->edid);
	p->edid = NULL;

	return 0;
}

static int panel_simple_unprepare(struct drm_panel *panel)
{
	struct panel_simple *p = to_panel_simple(panel);
	int ret;

	/* Unpreparing when already unprepared is a no-op */
	if (!p->prepared)
		return 0;

	pm_runtime_mark_last_busy(panel->dev);
	ret = pm_runtime_put_autosuspend(panel->dev);
	if (ret < 0)
		return ret;
	p->prepared = false;

	return 0;
}

static int panel_simple_resume(struct device *dev)
{
	struct panel_simple *p = dev_get_drvdata(dev);
	int err;

	panel_simple_wait(p->unprepared_time, p->desc->delay.unprepare);

	err = regulator_enable(p->supply);
	if (err < 0) {
		dev_err(dev, "failed to enable supply: %d\n", err);
		return err;
	}

	gpiod_set_value_cansleep(p->enable_gpio, 1);

	if (p->desc->delay.prepare)
		msleep(p->desc->delay.prepare);

	return 0;
}

static int panel_simple_prepare(struct drm_panel *panel)
{
	struct panel_simple *p = to_panel_simple(panel);
	int ret;

	/* Preparing when already prepared is a no-op */
	if (p->prepared)
		return 0;

	ret = pm_runtime_get_sync(panel->dev);
	if (ret < 0) {
		pm_runtime_put_autosuspend(panel->dev);
		return ret;
	}

	p->prepared = true;

	return 0;
}

static int panel_simple_enable(struct drm_panel *panel)
{
	struct panel_simple *p = to_panel_simple(panel);

	if (p->enabled)
		return 0;

	if (p->desc->delay.enable)
		msleep(p->desc->delay.enable);

	p->enabled = true;

	return 0;
}

static int panel_simple_get_modes(struct drm_panel *panel,
				  struct drm_connector *connector)
{
	struct panel_simple *p = to_panel_simple(panel);
	int num = 0;

	/* probe EDID if a DDC bus is available */
	if (p->ddc) {
		pm_runtime_get_sync(panel->dev);

		if (!p->edid)
			p->edid = drm_get_edid(connector, p->ddc);

		if (p->edid)
			num += drm_add_edid_modes(connector, p->edid);

		pm_runtime_mark_last_busy(panel->dev);
		pm_runtime_put_autosuspend(panel->dev);
	}

	/* add hard-coded panel modes */
	num += panel_simple_get_non_edid_modes(p, connector);

	/*
	 * TODO: Remove once all drm drivers call
	 * drm_connector_set_orientation_from_panel()
	 */
	drm_connector_set_panel_orientation(connector, p->orientation);

	return num;
}

static int panel_simple_get_timings(struct drm_panel *panel,
				    unsigned int num_timings,
				    struct display_timing *timings)
{
	struct panel_simple *p = to_panel_simple(panel);
	unsigned int i;

	if (p->desc->num_timings < num_timings)
		num_timings = p->desc->num_timings;

	if (timings)
		for (i = 0; i < num_timings; i++)
			timings[i] = p->desc->timings[i];

	return p->desc->num_timings;
}

static enum drm_panel_orientation panel_simple_get_orientation(struct drm_panel *panel)
{
	struct panel_simple *p = to_panel_simple(panel);

	return p->orientation;
}

static const struct drm_panel_funcs panel_simple_funcs = {
	.disable = panel_simple_disable,
	.unprepare = panel_simple_unprepare,
	.prepare = panel_simple_prepare,
	.enable = panel_simple_enable,
	.get_modes = panel_simple_get_modes,
	.get_orientation = panel_simple_get_orientation,
	.get_timings = panel_simple_get_timings,
};

static struct panel_desc panel_dpi;

static int panel_dpi_probe(struct device *dev,
			   struct panel_simple *panel)
{
	struct display_timing *timing;
	const struct device_node *np;
	struct panel_desc *desc;
	unsigned int bus_flags;
	struct videomode vm;
	int ret;

	np = dev->of_node;
	desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
	if (!desc)
		return -ENOMEM;

	timing = devm_kzalloc(dev, sizeof(*timing), GFP_KERNEL);
	if (!timing)
		return -ENOMEM;

	ret = of_get_display_timing(np, "panel-timing", timing);
	if (ret < 0) {
		dev_err(dev, "%pOF: no panel-timing node found for \"panel-dpi\" binding\n",
			np);
		return ret;
	}

	desc->timings = timing;
	desc->num_timings = 1;

	of_property_read_u32(np, "width-mm", &desc->size.width);
	of_property_read_u32(np, "height-mm", &desc->size.height);

	/* Extract bus_flags from display_timing */
	bus_flags = 0;
	vm.flags = timing->flags;
	drm_bus_flags_from_videomode(&vm, &bus_flags);
	desc->bus_flags = bus_flags;

	/* We do not know the connector for the DT node, so guess it */
	desc->connector_type = DRM_MODE_CONNECTOR_DPI;

	panel->desc = desc;

	return 0;
}

#define PANEL_SIMPLE_BOUNDS_CHECK(to_check, bounds, field) \
	(to_check->field.typ >= bounds->field.min && \
	 to_check->field.typ <= bounds->field.max)
static void panel_simple_parse_panel_timing_node(struct device *dev,
						 struct panel_simple *panel,
						 const struct display_timing *ot)
{
	const struct panel_desc *desc = panel->desc;
	struct videomode vm;
	unsigned int i;

	if (WARN_ON(desc->num_modes)) {
		dev_err(dev, "Reject override mode: panel has a fixed mode\n");
		return;
	}
	if (WARN_ON(!desc->num_timings)) {
		dev_err(dev, "Reject override mode: no timings specified\n");
		return;
	}

	for (i = 0; i < panel->desc->num_timings; i++) {
		const struct display_timing *dt = &panel->desc->timings[i];

		if (!PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, hactive) ||
		    !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, hfront_porch) ||
		    !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, hback_porch) ||
		    !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, hsync_len) ||
		    !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, vactive) ||
		    !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, vfront_porch) ||
		    !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, vback_porch) ||
		    !PANEL_SIMPLE_BOUNDS_CHECK(ot, dt, vsync_len))
			continue;

		if (ot->flags != dt->flags)
			continue;

		videomode_from_timing(ot, &vm);
		drm_display_mode_from_videomode(&vm, &panel->override_mode);
		panel->override_mode.type |= DRM_MODE_TYPE_DRIVER |
					     DRM_MODE_TYPE_PREFERRED;
		break;
	}

	if (WARN_ON(!panel->override_mode.type))
		dev_err(dev, "Reject override mode: No display_timing found\n");
}

static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
{
	struct panel_simple *panel;
	struct display_timing dt;
	struct device_node *ddc;
	int connector_type;
	u32 bus_flags;
	int err;

	panel = devm_kzalloc(dev, sizeof(*panel), GFP_KERNEL);
	if (!panel)
		return -ENOMEM;

	panel->enabled = false;
	panel->desc = desc;

	panel->supply = devm_regulator_get(dev, "power");
	if (IS_ERR(panel->supply))
		return PTR_ERR(panel->supply);

	panel->enable_gpio = devm_gpiod_get_optional(dev, "enable",
						     GPIOD_OUT_LOW);
	if (IS_ERR(panel->enable_gpio))
		return dev_err_probe(dev, PTR_ERR(panel->enable_gpio),
				     "failed to request GPIO\n");

	err = of_drm_get_panel_orientation(dev->of_node, &panel->orientation);
	if (err) {
		dev_err(dev, "%pOF: failed to get orientation %d\n", dev->of_node, err);
		return err;
	}

	ddc = of_parse_phandle(dev->of_node, "ddc-i2c-bus", 0);
	if (ddc) {
		panel->ddc = of_find_i2c_adapter_by_node(ddc);
		of_node_put(ddc);

		if (!panel->ddc)
			return -EPROBE_DEFER;
	}

	if (desc == &panel_dpi) {
		/* Handle the generic panel-dpi binding */
		err = panel_dpi_probe(dev, panel);
		if (err)
			goto free_ddc;
		desc = panel->desc;
	} else {
		if (!of_get_display_timing(dev->of_node, "panel-timing", &dt))
			panel_simple_parse_panel_timing_node(dev, panel, &dt);
	}

	connector_type = desc->connector_type;
	/* Catch common mistakes for panels. */
	switch (connector_type) {
	case 0:
		dev_warn(dev, "Specify missing connector_type\n");
		connector_type = DRM_MODE_CONNECTOR_DPI;
		break;
	case DRM_MODE_CONNECTOR_LVDS:
		WARN_ON(desc->bus_flags &
			~(DRM_BUS_FLAG_DE_LOW |
			  DRM_BUS_FLAG_DE_HIGH |
			  DRM_BUS_FLAG_DATA_MSB_TO_LSB |
			  DRM_BUS_FLAG_DATA_LSB_TO_MSB));
		WARN_ON(desc->bus_format != MEDIA_BUS_FMT_RGB666_1X7X3_SPWG &&
			desc->bus_format != MEDIA_BUS_FMT_RGB888_1X7X4_SPWG &&
			desc->bus_format != MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA);
		WARN_ON(desc->bus_format == MEDIA_BUS_FMT_RGB666_1X7X3_SPWG &&
			desc->bpc != 6);
		WARN_ON((desc->bus_format == MEDIA_BUS_FMT_RGB888_1X7X4_SPWG ||
			 desc->bus_format == MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA) &&
			desc->bpc != 8);
		break;
	case DRM_MODE_CONNECTOR_eDP:
		dev_warn(dev, "eDP panels moved to panel-edp\n");
		err = -EINVAL;
		goto free_ddc;
	case DRM_MODE_CONNECTOR_DSI:
		if (desc->bpc != 6 && desc->bpc != 8)
			dev_warn(dev, "Expected bpc in {6,8} but got: %u\n", desc->bpc);
		break;
	case DRM_MODE_CONNECTOR_DPI:
		bus_flags = DRM_BUS_FLAG_DE_LOW |
			    DRM_BUS_FLAG_DE_HIGH |
			    DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE |
			    DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE |
			    DRM_BUS_FLAG_DATA_MSB_TO_LSB |
			    DRM_BUS_FLAG_DATA_LSB_TO_MSB |
			    DRM_BUS_FLAG_SYNC_SAMPLE_POSEDGE |
			    DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE;
		if (desc->bus_flags & ~bus_flags)
			dev_warn(dev, "Unexpected bus_flags(%d)\n", desc->bus_flags & ~bus_flags);
		if (!(desc->bus_flags & bus_flags))
			dev_warn(dev, "Specify missing bus_flags\n");
		if (desc->bus_format == 0)
			dev_warn(dev, "Specify missing bus_format\n");
		if (desc->bpc != 6 && desc->bpc != 8)
			dev_warn(dev, "Expected bpc in {6,8} but got: %u\n", desc->bpc);
		break;
	default:
		dev_warn(dev, "Specify a valid connector_type: %d\n", desc->connector_type);
		connector_type = DRM_MODE_CONNECTOR_DPI;
		break;
	}

	dev_set_drvdata(dev, panel);

	/*
	 * We use runtime PM for prepare / unprepare since those power the panel
	 * on and off and those can be very slow operations. This is important
	 * to optimize powering the panel on briefly to read the EDID before
	 * fully enabling the panel.
	 */
	pm_runtime_enable(dev);
	pm_runtime_set_autosuspend_delay(dev, 1000);
	pm_runtime_use_autosuspend(dev);

	drm_panel_init(&panel->base, dev, &panel_simple_funcs, connector_type);

	err = drm_panel_of_backlight(&panel->base);
	if (err) {
		dev_err_probe(dev, err, "Could not find backlight\n");
		goto disable_pm_runtime;
	}

	drm_panel_add(&panel->base);

	return 0;

disable_pm_runtime:
	pm_runtime_dont_use_autosuspend(dev);
	pm_runtime_disable(dev);
free_ddc:
	if (panel->ddc)
		put_device(&panel->ddc->dev);

	return err;
}

static void panel_simple_remove(struct device *dev)
{
	struct panel_simple *panel = dev_get_drvdata(dev);

	drm_panel_remove(&panel->base);
	drm_panel_disable(&panel->base);
	drm_panel_unprepare(&panel->base);

	pm_runtime_dont_use_autosuspend(dev);
	pm_runtime_disable(dev);
	if (panel->ddc)
		put_device(&panel->ddc->dev);
}

static void panel_simple_shutdown(struct device *dev)
{
	struct panel_simple *panel = dev_get_drvdata(dev);

	drm_panel_disable(&panel->base);
	drm_panel_unprepare(&panel->base);
}

static const struct display_timing innolux_g101ice_l01_timing = {
	.pixelclock = { 60400000, 71100000, 74700000 },
	.hactive = { 1280, 1280, 1280 },
	.hfront_porch = { 30, 60, 70 },
	.hback_porch = { 30, 60, 70 },
	.hsync_len = { 22, 40, 60 },
	.vactive = { 800, 800, 800 },
	.vfront_porch = { 3, 8, 14 },
	.vback_porch = { 3, 8, 14 },
	.vsync_len = { 4, 7, 12 },
	.flags = DISPLAY_FLAGS_DE_HIGH,
};

static const struct panel_desc innolux_g101ice_l01 = {
	.timings = &innolux_g101ice_l01_timing,
	.num_timings = 1,
	.bpc = 8,
	.size = {
		.width = 217,
		.height = 135,
	},
	.delay = {
		.enable = 200,
		.disable = 200,
	},
	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
	.bus_flags = DRM_BUS_FLAG_DE_HIGH,
	.connector_type = DRM_MODE_CONNECTOR_LVDS,
};


static const struct of_device_id platform_of_match[] = {
	{
		.compatible = "innolux,g101ice-l01",
		.data = &innolux_g101ice_l01
	}, {
		/* sentinel */
	}
};
MODULE_DEVICE_TABLE(of, platform_of_match);

static int panel_simple_platform_probe(struct platform_device *pdev)
{
	const struct panel_desc *desc;

	desc = of_device_get_match_data(&pdev->dev);
	if (!desc)
		return -ENODEV;

	return panel_simple_probe(&pdev->dev, desc);
}

static void panel_simple_platform_remove(struct platform_device *pdev)
{
	panel_simple_remove(&pdev->dev);
}

static void panel_simple_platform_shutdown(struct platform_device *pdev)
{
	panel_simple_shutdown(&pdev->dev);
}

static const struct dev_pm_ops panel_simple_pm_ops = {
	SET_RUNTIME_PM_OPS(panel_simple_suspend, panel_simple_resume, NULL)
	SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
				pm_runtime_force_resume)
};

static struct platform_driver panel_simple_platform_driver = {
	.driver = {
		.name = "panel-simple",
		.of_match_table = platform_of_match,
		.pm = &panel_simple_pm_ops,
	},
	.probe = panel_simple_platform_probe,
	.remove_new = panel_simple_platform_remove,
	.shutdown = panel_simple_platform_shutdown,
};

struct panel_desc_dsi {
	struct panel_desc desc;

	unsigned long flags;
	enum mipi_dsi_pixel_format format;
	unsigned int lanes;
};

static const struct drm_display_mode lg_ld070wx3_sl01_mode = {
	.clock = 71000,
	.hdisplay = 800,
	.hsync_start = 800 + 32,
	.hsync_end = 800 + 32 + 1,
	.htotal = 800 + 32 + 1 + 57,
	.vdisplay = 1280,
	.vsync_start = 1280 + 28,
	.vsync_end = 1280 + 28 + 1,
	.vtotal = 1280 + 28 + 1 + 14,
};

static const struct panel_desc_dsi lg_ld070wx3_sl01 = {
	.desc = {
		.modes = &lg_ld070wx3_sl01_mode,
		.num_modes = 1,
		.bpc = 8,
		.size = {
			.width = 94,
			.height = 151,
		},
		.connector_type = DRM_MODE_CONNECTOR_DSI,
	},
	.flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
	.format = MIPI_DSI_FMT_RGB888,
	.lanes = 4,
};


static const struct of_device_id dsi_of_match[] = {
	 {
		.compatible = "lg,ld070wx3-sl01",
		.data = &lg_ld070wx3_sl01
	}, {
		/* sentinel */
	}
};
MODULE_DEVICE_TABLE(of, dsi_of_match);

static int panel_simple_dsi_probe(struct mipi_dsi_device *dsi)
{
	const struct panel_desc_dsi *desc;
	int err;

	printk("panel_simple_dsi_probe 941 START\n");
	desc = of_device_get_match_data(&dsi->dev);
	if (!desc)
		return -ENODEV;

	err = panel_simple_probe(&dsi->dev, &desc->desc);
	if (err < 0)
		return err;

	dsi->mode_flags = desc->flags;
	dsi->format = desc->format;
	dsi->lanes = desc->lanes;

	err = mipi_dsi_attach(dsi);
	if (err) {
		struct panel_simple *panel = mipi_dsi_get_drvdata(dsi);

		drm_panel_remove(&panel->base);
	}
	printk("panel_simple_dsi_probe 941 end\n");
	return err;
}

static void panel_simple_dsi_remove(struct mipi_dsi_device *dsi)
{
	int err;

	err = mipi_dsi_detach(dsi);
	if (err < 0)
		dev_err(&dsi->dev, "failed to detach from DSI host: %d\n", err);

	panel_simple_remove(&dsi->dev);
}

static void panel_simple_dsi_shutdown(struct mipi_dsi_device *dsi)
{
	panel_simple_shutdown(&dsi->dev);
}

static struct mipi_dsi_driver panel_simple_dsi_driver = {
	.driver = {
		.name = "panel-simple-dsi",
		.of_match_table = dsi_of_match,
		.pm = &panel_simple_pm_ops,
	},
	.probe = panel_simple_dsi_probe,
	.remove = panel_simple_dsi_remove,
	.shutdown = panel_simple_dsi_shutdown,
};

static int __init panel_simple_init(void)
{
	int err;

	err = platform_driver_register(&panel_simple_platform_driver);
	if (err < 0)
		return err;

	if (IS_ENABLED(CONFIG_DRM_MIPI_DSI)) {
		err = mipi_dsi_driver_register(&panel_simple_dsi_driver);
		if (err < 0)
			goto err_did_platform_register;
	}

	return 0;

err_did_platform_register:
	platform_driver_unregister(&panel_simple_platform_driver);

	return err;
}
module_init(panel_simple_init);

static void __exit panel_simple_exit(void)
{
	if (IS_ENABLED(CONFIG_DRM_MIPI_DSI))
		mipi_dsi_driver_unregister(&panel_simple_dsi_driver);

	platform_driver_unregister(&panel_simple_platform_driver);
}
module_exit(panel_simple_exit);

MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>");
MODULE_DESCRIPTION("DRM Driver for Simple Panels");
MODULE_LICENSE("GPL and additional rights");

I only kept ".compatible = "innolux,g101ice-l01"". I also didn't get any log output when printing logs inside the panel_simple_dsi_probe function.

When using the command zcat /proc/config.gz | grep CONFIG_DRM_PANEL_SIMPLE, it shows that CONFIG_DRM_PANEL_SIMPLE=m. The following is the dmesg information.

display_0507.log

Could you please help me figure out how to successfully probe panel-simple.c and enable the DSI to have signal output?

Regards,

FuGuojia

  • Hi FuGuojia,

    You need to set up the devicetree to link the display to the bridge, and the bridge to the DSI port, and the DSI port to the DSS port. 

    This is a good example that links a raspberry PI display to the BeagleBoneAI64 board from BeagleBoard community: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/arch/arm64/boot/dts/ti/k3-j721e-beagleboneai64-dsi-rpi-7inch-panel.dtso?h=ti-linux-6.6.y

    Below is the detailed explanation.

    The "port" property links the display to the bridge:

    		port {
    			panel_in: endpoint {
    				remote-endpoint = <&panel_bridge_out>;
    			};
    		};

    And the toshiba,tc358762 bridge links the display panel and the DSI port:

    			port@0 {
    				reg = <0>;
    				panel_bridge_in: endpoint {
    					remote-endpoint = <&dsi0_out>;
    				};
    			};
    
    			port@1 {
    				reg = <1>;
    				panel_bridge_out: endpoint {
    					remote-endpoint = <&panel_in>;
    				};
    			};

    And then the DSI port creates links between the bridge and the DSS port:

    		port@0 {
    			reg = <0>;
    			dsi0_out: endpoint {
    				remote-endpoint = <&panel_bridge_in>;
    			};
    		};
    
    		port@1 {
    			reg = <1>;
    			dsi0_in: endpoint {
    				remote-endpoint = <&dpi2_out>;
    			};
    		};

    And lastly, the DSS port is connected to DSI port:

    	port@2 {
    		reg = <2>;
    
    		dpi2_out: endpoint {
    			remote-endpoint = <&dsi0_in>;
    		};
    	};

    However, based off of your previous E2E thread here, your bridge driver is missing the functionality to connect between the ports: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1502966/tda4vm-sdk-version-is-tda4vm_sdk_10-05-how-to-use-the-psdkla-of-dispc-c-and-dsi-c-to-configure-the-dsi-and-timing-parameters/5802891?tisearch=e2e-sitesearch&keymatch=%2520user%253A638859#5802891 

    This is the reason why the display is not coming up, because you do not have the display pipeline in the devicetree to allow the Linux kernel to probe for the display. And the reason why you do not have the display pipeline is because your driver is missing vital features to connect the different ports. 

    Regards,

    Takuma

  • Hi Takuma

    I have made changes to the device tree and my code for the 941 according to what you said. The device tree file (Lines 554 to 648) is as follows. 

    // SPDX-License-Identifier: GPL-2.0
    /*
     * Copyright (C) 2019 Texas Instruments Incorporated - https://www.ti.com/
     *
     * Product Link: https://www.ti.com/tool/J721EXCPXEVM
     */
    
    /dts-v1/;
    
    #include "k3-j721e-som-p0.dtsi"
    #include <dt-bindings/gpio/gpio.h>
    #include <dt-bindings/input/input.h>
    #include <dt-bindings/net/ti-dp83867.h>
    #include <dt-bindings/phy/phy-cadence.h>
    
    / {
    	compatible = "ti,j721e-evm", "ti,j721e";
    	model = "Texas Instruments J721e EVM";
    
    	aliases {
    		serial0 = &wkup_uart0;
    		serial1 = &mcu_uart0;
    		serial2 = &main_uart0;
    		serial7 = &main_uart5;
    		spi3 = &main_spi3;
    		spi5 = &main_spi5;
    		ethernet0 = &cpsw_port1;
    		mmc0 = &main_sdhci0;
    		mmc1 = &main_sdhci1;
    	};
    
    	chosen {
    		stdout-path = "serial2:115200n8";
    		bootargs = "console=ttyS2,115200n8 earlycon=ns16550a,mmio32,0x02800000 root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait";
    	};
    
    	evm_12v0: fixedregulator-evm12v0 {
    		/* main supply */
    		compatible = "regulator-fixed";
    		regulator-name = "evm_12v0";
    		regulator-min-microvolt = <12000000>;
    		regulator-max-microvolt = <12000000>;
    		regulator-always-on;
    		regulator-boot-on;
    	};
    
    	vsys_3v3: fixedregulator-vsys3v3 {
    		/* Output of LMS140 */
    		compatible = "regulator-fixed";
    		regulator-name = "vsys_3v3";
    		regulator-min-microvolt = <3300000>;
    		regulator-max-microvolt = <3300000>;
    		vin-supply = <&evm_12v0>;
    		regulator-always-on;
    		regulator-boot-on;
    	};
    
    	vsys_5v0: fixedregulator-vsys5v0 {
    		/* Output of LM5140 */
    		compatible = "regulator-fixed";
    		regulator-name = "vsys_5v0";
    		regulator-min-microvolt = <5000000>;
    		regulator-max-microvolt = <5000000>;
    		vin-supply = <&evm_12v0>;
    		regulator-always-on;
    		regulator-boot-on;
    	};
    
    	vdd_mmc1: fixedregulator-sd {
    		compatible = "regulator-fixed";
    		regulator-name = "vdd_mmc1";
    		regulator-min-microvolt = <3300000>;
    		regulator-max-microvolt = <3300000>;
    		regulator-boot-on;
    		enable-active-high;
    		vin-supply = <&vsys_3v3>;
    		//gpio = <&exp2 2 GPIO_ACTIVE_HIGH>;
    	};
    
    	vdd_sd_dv_alt: gpio-regulator-tps659411 {
    		compatible = "regulator-gpio";
    		pinctrl-names = "default";
    		pinctrl-0 = <&vdd_sd_dv_alt_pins_default>;
    		regulator-name = "vdd_sd_dv";
    		regulator-min-microvolt = <1800000>;
    		regulator-max-microvolt = <3300000>;
    		regulator-boot-on;
    		vin-supply = <&vsys_3v3>;
    		gpios = <&main_gpio0 111 GPIO_ACTIVE_HIGH>;
    		states = <1800000 0x0>,
    			 <3300000 0x1>;
    	};
    
    	dp_pwr_3v3: regulator-dp-pwr {
    		compatible = "regulator-fixed";
    		regulator-name = "dp-pwr";
    		regulator-min-microvolt = <3300000>;
    		regulator-max-microvolt = <3300000>;
    		//gpio = <&exp4 0 GPIO_ACTIVE_HIGH>; /* P0 - DP0_PWR_SW_EN */
    		enable-active-high;
    	};
    
    	dp0: connector {
    		compatible = "dp-connector";
    		label = "DP0";
    		type = "full-size";
    		dp-pwr-supply = <&dp_pwr_3v3>;
    
    		port {
    			dp_connector_in: endpoint {
    				remote-endpoint = <&dp0_out>;
    			};
    		};
    	};
    
    	pps_gpio {
    		status = "okay";
    		compatible = "pps-gpio";
    		gpios = <&main_gpio1 13 GPIO_ACTIVE_HIGH>;
    	};
    
    	codec_test: codec_test {
    		compatible = "linux,snd-soc-dummy";
    		#sound-dai-cells = <0>;
    		status="okay";
    	};
    
    	codec_audio0: sound0 {
    		compatible = "simple-audio-card";
    		simple-audio-card,name = "FXN_A2B";
    		simple-audio-card,format = "i2s";
    		simple-audio-card,bitclock-master = <&sound_master0>;
    		simple-audio-card,frame-master = <&sound_master0>;
    
    		sound_master0: simple-audio-card,cpu {
    		sound-dai = <&mcasp1>;
    		system-clock-direction-out;
    		};
    
    		simple-audio-card,codec {
    			sound-dai = <&codec_test>;
    		};
    	};
    
    
    };
    
    &main_pmx0 {
    	main_uart0_pins_default: main-uart0-default-pins {
    		pinctrl-single,pins = <
    			J721E_IOPAD(0x1f0, PIN_INPUT, 0) /* (AC2) UART0_CTSn */
    			J721E_IOPAD(0x1f4, PIN_OUTPUT, 0) /* (AB1) UART0_RTSn */
    			J721E_IOPAD(0x1e8, PIN_INPUT, 0) /* (AB2) UART0_RXD */
    			J721E_IOPAD(0x1ec, PIN_OUTPUT, 0) /* (AB3) UART0_TXD */
    		>;
    	};
    
    	main_mmc1_pins_default: main-mmc1-default-pins {
    		pinctrl-single,pins = <
    			J721E_IOPAD(0x254, PIN_INPUT, 0) /* (R29) MMC1_CMD */
    			J721E_IOPAD(0x250, PIN_INPUT, 0) /* (P25) MMC1_CLK */
    			J721E_IOPAD(0x2ac, PIN_INPUT, 0) /* (P25) MMC1_CLKLB */
    			J721E_IOPAD(0x24c, PIN_INPUT, 0) /* (R24) MMC1_DAT0 */
    			J721E_IOPAD(0x248, PIN_INPUT, 0) /* (P24) MMC1_DAT1 */
    			J721E_IOPAD(0x244, PIN_INPUT, 0) /* (R25) MMC1_DAT2 */
    			J721E_IOPAD(0x240, PIN_INPUT, 0) /* (R26) MMC1_DAT3 */
    			J721E_IOPAD(0x258, PIN_INPUT, 0) /* (P23) MMC1_SDCD */
    			J721E_IOPAD(0x25c, PIN_INPUT, 0) /* (R28) MMC1_SDWP */
    		>;
    	};
    
    	vdd_sd_dv_alt_pins_default: vdd-sd-dv-alt-default-pins {
    		pinctrl-single,pins = <
    			J721E_IOPAD(0x1c0, PIN_OUTPUT, 7) /* (AA2) SPI0_CS0.GPIO0_111 */
    		>;
    	};
    
    	dp0_pins_default: dp0-default-pins {
    		pinctrl-single,pins = <
    			J721E_IOPAD(0x1c4, PIN_INPUT, 5) /* SPI0_CS1.DP0_HPD */
    		>;
    	};
    
    	mcasp10_pins_default: mcasp10-default-pins {
    		pinctrl-single,pins = <
    			//J721E_IOPAD(0x158, PIN_OUTPUT_PULLDOWN, 12) /* (U23) RGMII5_TX_CTL.MCASP10_ACLKX */ /*pin FOR I2C2  del 2025/02/25  */
    			//J721E_IOPAD(0x15c, PIN_OUTPUT_PULLDOWN, 12) /* (U26) RGMII5_RX_CTL.MCASP10_AFSX */  /*pin FOR I2C2  del 2025/02/25  */
    			//J721E_IOPAD(0x160, PIN_OUTPUT_PULLDOWN, 12) /* (V28) RGMII5_TD3.MCASP10_AXR0 */     /*pin FOR UART3  del 2025/02/25  */
    			//J721E_IOPAD(0x164, PIN_OUTPUT_PULLDOWN, 12) /* (V29) RGMII5_TD2.MCASP10_AXR1 */     /*pin FOR UART3  del 2025/02/25  */
    			//J721E_IOPAD(0x170, PIN_OUTPUT_PULLDOWN, 12) /* (U29) RGMII5_TXC.MCASP10_AXR2 */
    			//J721E_IOPAD(0x174, PIN_OUTPUT_PULLDOWN, 12) /* (U25) RGMII5_RXC.MCASP10_AXR3 */
    			// J721E_IOPAD(0x198, PIN_INPUT_PULLDOWN, 12) /* (V25) RGMII6_TD1.MCASP10_AXR4 */	/* pin FOR SPI5  del 2025/02/27   */
    			// J721E_IOPAD(0x19c, PIN_INPUT_PULLDOWN, 12) /* (W27) RGMII6_TD0.MCASP10_AXR5 */
    			// J721E_IOPAD(0x1a0, PIN_INPUT_PULLDOWN, 12) /* (W29) RGMII6_TXC.MCASP10_AXR6 */	/* pin FOR SPI5  del 2025/02/27   */
    		>;
    	};
    
    	/* conflict gpio delete for /dev/gpiochip0 */
    	// audi_ext_refclk2_pins_default: audi-ext-refclk2-default-pins {
    	// 	pinctrl-single,pins = <
    	// 		J721E_IOPAD(0x1a4, PIN_OUTPUT, 3) /* (W26) RGMII6_RXC.AUDIO_EXT_REFCLK2 */
    	// 	>;
    	// };
    
    	// main域gpio0的设备树具体内容需要各位老师确认,有需要则打开注释,最后仍保留注释部分将从设备树中删除
    	// add
    	main_gpio0_pins_default: main-gpio0-default-pins {
    		pinctrl-single,pins = <
    			// J721E_IOPAD(0x4, PIN_OUTPUT, 7) /* (AC23) PRG1_PRU0_GPO0.GPIO0_1 */
    			// J721E_IOPAD(0x8, PIN_INPUT, 7) /* (AG22) PRG1_PRU0_GPO1.GPIO0_2 */
    			// J721E_IOPAD(0xc, PIN_OUTPUT, 7) /* (AF22) PRG1_PRU0_GPO2.GPIO0_3 */
    			//J721E_IOPAD(0x10, PIN_OUTPUT_PULLDOWN, 7) /* (AJ23) PRG1_PRU0_GPO3.GPIO0_4 */
    			// J721E_IOPAD(0x14, PIN_OUTPUT, 7) /* (AH23) PRG1_PRU0_GPO4.GPIO0_5 */
    			// J721E_IOPAD(0x1c, PIN_OUTPUT, 7) /* (AD22) PRG1_PRU0_GPO6.GPIO0_7 */
    			J721E_IOPAD(0x28, PIN_INPUT, 7) /* (AG20) PRG1_PRU0_GPO9.GPIO0_10 */
    			J721E_IOPAD(0x2c, PIN_OUTPUT_PULLUP, 7) /* (AD21) PRG1_PRU0_GPO10.GPIO0_11 */
    			// J721E_IOPAD(0x30, PIN_OUTPUT, 7) /* (AF24) PRG1_PRU0_GPO11.GPIO0_12 */
    			// J721E_IOPAD(0x34, PIN_OUTPUT, 7) /* (AJ24) PRG1_PRU0_GPO12.GPIO0_13 */
    			// J721E_IOPAD(0x38, PIN_INPUT, 7) /* (AG24) PRG1_PRU0_GPO13.GPIO0_14 */
    			// J721E_IOPAD(0x3c, PIN_OUTPUT, 7) /* (AD24) PRG1_PRU0_GPO14.GPIO0_15 */
    			// J721E_IOPAD(0x40, PIN_INPUT, 7) /* (AC24) PRG1_PRU0_GPO15.GPIO0_16 */
    			// J721E_IOPAD(0x44, PIN_INPUT, 7) /* (AE24) PRG1_PRU0_GPO16.GPIO0_17 */
    			// J721E_IOPAD(0x4c, PIN_INPUT, 7) /* (AJ21) PRG1_PRU0_GPO17.GPIO0_18 */
    			// J721E_IOPAD(0x50, PIN_INPUT, 7) /* (AE21) PRG1_PRU0_GPO18.GPIO0_19 */
    			// J721E_IOPAD(0x54, PIN_INPUT, 7) /* (AH21) PRG1_PRU0_GPO19.GPIO0_20 */
    			// J721E_IOPAD(0x58, PIN_INPUT, 7) /* (AE22) PRG1_PRU1_GPO0.GPIO0_21 */
    			// J721E_IOPAD(0x5c, PIN_INPUT, 7) /* (AG23) PRG1_PRU1_GPO1.GPIO0_22 */
    			// J721E_IOPAD(0x60, PIN_INPUT, 7) /* (AF23) PRG1_PRU1_GPO2.GPIO0_23 */
    			// J721E_IOPAD(0x64, PIN_INPUT, 7) /* (AD23) PRG1_PRU1_GPO3.GPIO0_24 */
    			// J721E_IOPAD(0x68, PIN_INPUT, 7) /* (AH24) PRG1_PRU1_GPO4.GPIO0_25 */
    			// J721E_IOPAD(0x6c, PIN_INPUT, 7) /* (AG21) PRG1_PRU1_GPO5.GPIO0_26 */
    			// J721E_IOPAD(0x70, PIN_INPUT, 7) /* (AE23) PRG1_PRU1_GPO6.GPIO0_27 */
    			// J721E_IOPAD(0x74, PIN_INPUT, 7) /* (AC21) PRG1_PRU1_GPO7.GPIO0_28 */
    			// J721E_IOPAD(0x78, PIN_INPUT, 7) /* (Y23) PRG1_PRU1_GPO8.GPIO0_29 */
    			// J721E_IOPAD(0x7c, PIN_OUTPUT, 7) /* (AF21) PRG1_PRU1_GPO9.GPIO0_30 */
    			// J721E_IOPAD(0x80, PIN_OUTPUT, 7) /* (AB23) PRG1_PRU1_GPO10.GPIO0_31 */
    			// J721E_IOPAD(0x90, PIN_OUTPUT_PULLDOWN, 7) /* (AH26) PRG1_PRU1_GPO14.GPIO0_35 */
    			J721E_IOPAD(0x94, PIN_INPUT, 7) /* (AJ27) PRG1_PRU1_GPO15.GPIO0_36 */
    			J721E_IOPAD(0xa4, PIN_INPUT, 7) /* (AH22) PRG1_PRU1_GPO19.GPIO0_40 add for S32K SPI */
    			// J721E_IOPAD(0xa8, PIN_OUTPUT, 7) /* (AD19) PRG1_MDIO0_MDIO.GPIO0_41 */
    			// J721E_IOPAD(0xac, PIN_OUTPUT, 7) /* (AD18) PRG1_MDIO0_MDC.GPIO0_42 */
    			// J721E_IOPAD(0xb0, PIN_OUTPUT, 7) /* (AF28) PRG0_PRU0_GPO0.GPIO0_43 */
    			// J721E_IOPAD(0xb4, PIN_INPUT, 7) /* (AE28) PRG0_PRU0_GPO1.GPIO0_44 */
    			// J721E_IOPAD(0xb8, PIN_OUTPUT, 7) /* (AE27) PRG0_PRU0_GPO2.GPIO0_45 */
    			// J721E_IOPAD(0xbc, PIN_OUTPUT, 7) /* (AD26) PRG0_PRU0_GPO3.GPIO0_46 */
    			// J721E_IOPAD(0xc0, PIN_INPUT, 7) /* (AD25) PRG0_PRU0_GPO4.GPIO0_47 */
    			// J721E_IOPAD(0xc8, PIN_OUTPUT, 7) /* (AE26) PRG0_PRU0_GPO6.GPIO0_49 */
    			// J721E_IOPAD(0xcc, PIN_OUTPUT, 7) /* (AC28) PRG0_PRU0_GPO7.GPIO0_50 */
    			// J721E_IOPAD(0xd0, PIN_INPUT, 7) /* (AC27) PRG0_PRU0_GPO8.GPIO0_51 */
    			// J721E_IOPAD(0xdc, PIN_OUTPUT, 7) /* (AJ28) PRG0_PRU0_GPO11.GPIO0_54 */
    			// J721E_IOPAD(0xe0, PIN_OUTPUT, 7) /* (AH27) PRG0_PRU0_GPO12.GPIO0_55 */
    			// J721E_IOPAD(0xe4, PIN_INPUT, 7) /* (AH29) PRG0_PRU0_GPO13.GPIO0_56 */
    			// J721E_IOPAD(0xe8, PIN_INPUT, 7) /* (AG28) PRG0_PRU0_GPO14.GPIO0_57 */
    			// J721E_IOPAD(0xec, PIN_INPUT, 7) /* (AG27) PRG0_PRU0_GPO15.GPIO0_58 */
    			// J721E_IOPAD(0xf0, PIN_OUTPUT, 7) /* (AH28) PRG0_PRU0_GPO16.GPIO0_59 */
    			// J721E_IOPAD(0xf8, PIN_OUTPUT, 7) /* (AB29) PRG0_PRU0_GPO18.GPIO0_61 */
    			// J721E_IOPAD(0xfc, PIN_INPUT, 7) /* (AB28) PRG0_PRU0_GPO19.GPIO0_62 */
    			// J721E_IOPAD(0x100, PIN_INPUT, 7) /* (AE29) PRG0_PRU1_GPO0.GPIO0_63 */
    			// J721E_IOPAD(0x104, PIN_INPUT, 7) /* (AD28) PRG0_PRU1_GPO1.GPIO0_64 */
    			J721E_IOPAD(0x130, PIN_INPUT, 7) /* (AF27) PRG0_PRU1_GPO12.GPIO0_75 */
    			J721E_IOPAD(0x134, PIN_OUTPUT_PULLUP, 7) /* (AF26) PRG0_PRU1_GPO13.GPIO0_76 */
    			// J721E_IOPAD(0x138, PIN_OUTPUT_PULLUP, 7) /* (AE25) PRG0_PRU1_GPO14.GPIO0_77 */
    			// J721E_IOPAD(0x13c, PIN_OUTPUT, 7) /* (AF29) PRG0_PRU1_GPO15.GPIO0_78 */
    			// J721E_IOPAD(0x140, PIN_INPUT, 7) /* (AG29) PRG0_PRU1_GPO16.GPIO0_79 */
    			// J721E_IOPAD(0x154, PIN_OUTPUT_PULLDOWN, 7) /* (AA27) PRG0_MDIO0_MDC.GPIO0_84 */
    			// J721E_IOPAD(0x168, PIN_OUTPUT, 7) /* (V27) RGMII5_TD1.GPIO0_89 */
    			J721E_IOPAD(0x16c, PIN_INPUT, 7) /* (U28) RGMII5_TD0.GPIO0_90  OPEN for SPI3_CS2 IRQ */
    			// J721E_IOPAD(0x170, PIN_OUTPUT_PULLDOWN, 7) /* (U29) RGMII5_TXC.GPIO0_91 */
    			// J721E_IOPAD(0x174, PIN_OUTPUT_PULLDOWN, 7) /* (U25) RGMII5_RXC.GPIO0_92 */
    			// J721E_IOPAD(0x178, PIN_OUTPUT, 7) /* (U27) RGMII5_RD3.GPIO0_93 */
    			// J721E_IOPAD(0x17c, PIN_OUTPUT, 7) /* (U24) RGMII5_RD2.GPIO0_94 */
    			// J721E_IOPAD(0x180, PIN_OUTPUT_PULLDOWN, 7) /* (R23) RGMII5_RD1.GPIO0_95 */
    			// J721E_IOPAD(0x184, PIN_OUTPUT_PULLDOWN, 7) /* (T23) RGMII5_RD0.GPIO0_96 */
    			// J721E_IOPAD(0x188, PIN_OUTPUT, 7) /* (Y28) RGMII6_TX_CTL.GPIO0_97 */
    			J721E_IOPAD(0x18c, PIN_INPUT, 7) /* (V23) RGMII6_RX_CTL.GPIO0_98 */
    			J721E_IOPAD(0x190, PIN_INPUT, 7) /* (W23) RGMII6_TD3.GPIO0_99 */
    			// J721E_IOPAD(0x194, PIN_OUTPUT, 7) /* (W28) RGMII6_TD2.GPIO0_100 */
    			// J721E_IOPAD(0x198, PIN_OUTPUT, 7) /* (V25) RGMII6_TD1.GPIO0_101 */
    			// J721E_IOPAD(0x19c, PIN_OUTPUT, 7) /* (W27) RGMII6_TD0.GPIO0_102 */
    			// J721E_IOPAD(0x1a0, PIN_INPUT, 7) /* (W29) RGMII6_TXC.GPIO0_103 */
    			J721E_IOPAD(0x1a4, PIN_INPUT, 7) /* (W26) RGMII6_RXC.GPIO0_104 */
    			// J721E_IOPAD(0x1c0, PIN_OUTPUT, 7) /* (AA2) SPI0_CS0.GPIO0_111 */
    			// J721E_IOPAD(0x1c4, PIN_OUTPUT, 7) /* (Y4) SPI0_CS1.GPIO0_112 */
    			// J721E_IOPAD(0x1c8, PIN_OUTPUT, 7) /* (AA1) SPI0_CLK.GPIO0_113 */
    			// J721E_IOPAD(0x1cc, PIN_OUTPUT, 7) /* (AB5) SPI0_D0.GPIO0_114 */
    			// J721E_IOPAD(0x1d0, PIN_OUTPUT, 7) /* (AA3) SPI0_D1.GPIO0_115 */
    			// J721E_IOPAD(0x1dc, PIN_INPUT, 7) /* (Y1) SPI1_CLK.GPIO0_118 */
    			// J721E_IOPAD(0x1e0, PIN_INPUT, 7) /* (Y5) SPI1_D0.GPIO0_119 */
    			J721E_IOPAD(0x1e4, PIN_INPUT, 7) /* (Y2) SPI1_D1.GPIO0_120 */
    		>;
    	};
    
    	// main域gpio1的设备树具体内容需要各位老师确认,有需要则打开注释,最后仍保留注释部分将从设备树中删除
    	// add
    	main_gpio1_pins_default: main-gpio1-default-pins {
    		pinctrl-single,pins = <
    			// J721E_IOPAD(0x218, PIN_OUTPUT, 7) /* (W2) I3C0_SCL.GPIO1_5 */
    			// J721E_IOPAD(0x21c, PIN_INPUT, 7) /* (W1) I3C0_SDA.GPIO1_6 */
    			// J721E_IOPAD(0x230, PIN_INPUT, 7) /* (U2) ECAP0_IN_APWM_OUT.GPIO1_11 */
    			// J721E_IOPAD(0x234, PIN_INPUT, 7) /* (U3) EXT_REFCLK1.GPIO1_12 */
    			J721E_IOPAD(0x238, PIN_INPUT, 7) /* (V6) TIMER_IO0.GPIO1_13 ADD for PPS */
    			J721E_IOPAD(0x260, PIN_OUTPUT_PULLDOWN, 7) /* (T28) MMC2_DAT3.GPIO1_23 */
    			// J721E_IOPAD(0x264, PIN_INPUT, 7) /* (T29) MMC2_DAT2.GPIO1_24 */
    			//J721E_IOPAD(0x268, PIN_OUTPUT_PULLUP, 7) /* (T27) MMC2_DAT1.GPIO1_25 */ /*pin FOR TDA4_LG69T_RST  del 2025/02/25  */
    			// J721E_IOPAD(0x26c, PIN_OUTPUT, 7) /* (T24) MMC2_DAT0.GPIO1_26 */
    			// J721E_IOPAD(0x270, PIN_INPUT, 7) /* (T26) MMC2_CLK.GPIO1_27 */
    			// J721E_IOPAD(0x274, PIN_INPUT, 7) /* (T25) MMC2_CMD.GPIO1_28 */
    			// J721E_IOPAD(0x290, PIN_OUTPUT, 7) /* (U6) USB0_DRVVBUS.GPIO1_29 */
    			// J721E_IOPAD(0x294, PIN_INPUT, 7) /* (AD1) MLB0_MLBSP.GPIO1_30 */
    			// J721E_IOPAD(0x298, PIN_INPUT, 7) /* (AC1) MLB0_MLBSN.GPIO1_31 */
    			// J721E_IOPAD(0x29c, PIN_INPUT, 7) /* (AC3) MLB0_MLBDP.GPIO1_32 */
    			// J721E_IOPAD(0x2a0, PIN_INPUT, 7) /* (AD3) MLB0_MLBDN.GPIO1_33 */
    			// J721E_IOPAD(0x2a4, PIN_INPUT, 7) /* (AD2) MLB0_MLBCP.GPIO1_34 */
    			// J721E_IOPAD(0x2a8, PIN_INPUT, 7) /* (AE2) MLB0_MLBCN.GPIO1_35 */
    		>;
    	};
    
    	// add
    	main_mcasp1_pins_default: main-mcasp1-default-pins {
    		pinctrl-single,pins = <
    			J721E_IOPAD(0x114, PIN_OUTPUT, 12) /* (AB27) PRG0_PRU1_GPO5.MCASP1_ACLKX */
    			J721E_IOPAD(0x120, PIN_OUTPUT, 12) /* (AA28) PRG0_PRU1_GPO8.MCASP1_AFSX */
    			J721E_IOPAD(0x110, PIN_INPUT, 12) /* (AD29) PRG0_PRU1_GPO4.MCASP1_AXR2 */
    			J721E_IOPAD(0x118, PIN_INPUT, 12) /* (AC26) PRG0_PRU1_GPO6.MCASP1_AXR3 */
    			J721E_IOPAD(0x128, PIN_OUTPUT, 12) /* (AA25) PRG0_PRU1_GPO10.MCASP1_AXR6 */
    			J721E_IOPAD(0x12c, PIN_OUTPUT, 12) /* (AG26) PRG0_PRU1_GPO11.MCASP1_AXR7 */
    		>;
    	};
    
    	// add
    	main_mmcsd1_pins_default: main-mmcsd1-default-pins {
    		pinctrl-single,pins = <
    			J721E_IOPAD(0x254, PIN_INPUT, 0) /* (R29) MMC1_CMD */
    			J721E_IOPAD(0x250, PIN_INPUT, 0) /* (P25) MMC1_CLK */
    			J721E_IOPAD(0x2ac, PIN_INPUT, 0) /* (P25) MMC1_CLKLB */
    			J721E_IOPAD(0x24c, PIN_INPUT, 0) /* (R24) MMC1_DAT0 */
    			J721E_IOPAD(0x248, PIN_INPUT, 0) /* (P24) MMC1_DAT1 */
    			J721E_IOPAD(0x244, PIN_INPUT, 0) /* (R25) MMC1_DAT2 */
    			J721E_IOPAD(0x240, PIN_INPUT, 0) /* (R26) MMC1_DAT3 */
    			J721E_IOPAD(0x258, PIN_INPUT, 0) /* (P23) MMC1_SDCD */
    		>;
    	};
    
    	// add
    	main_pcie3_pins_default: main-pcie3-default-pins {
    		pinctrl-single,pins = <
    			J721E_IOPAD(0x25c, PIN_INPUT, 6) /* (R28) MMC1_SDWP.PCIE3_CLKREQn */
    		>;
    	};
    		main_i2c1_exp4_pins_default: main-i2c1-exp4-default-pins {
    		pinctrl-single,pins = <
    			J721E_IOPAD(0x230, PIN_INPUT, 7) /* (U2) ECAP0_IN_APWM_OUT.GPIO1_11 */
    		>;
    	};
    
    	main_i2c1_pins_default: main-i2c1-default-pins {
    		pinctrl-single,pins = <
    			J721E_IOPAD(0x228, PIN_INPUT_PULLUP, 0) /* (Y6) I2C1_SCL */
    			J721E_IOPAD(0x22c, PIN_INPUT_PULLUP, 0) /* (AA6) I2C1_SDA */
    		>;
    	};
    	/* AG190W SPI <---> TDA4 SPI3 */
    	main_spi3_pins_default: main-spi3-default-pins {
    		pinctrl-single,pins = <
    			J721E_IOPAD(0x144, PIN_INPUT, 4) /* (Y25) PRG0_PRU1_GPO17.SPI3_CLK */
    			J721E_IOPAD(0x11c, PIN_INPUT, 4) /* (AA24) PRG0_PRU1_GPO7.SPI3_CS0 */
    			J721E_IOPAD(0xd4, PIN_INPUT, 4) /* (AB26) PRG0_PRU0_GPO9.SPI3_CS1 */
    			J721E_IOPAD(0xd8, PIN_INPUT, 4) /* (AB25) PRG0_PRU0_GPO10.SPI3_CS2 */
    			J721E_IOPAD(0x124, PIN_INPUT, 4) /* (Y24) PRG0_PRU1_GPO9.SPI3_CS3 */
    			J721E_IOPAD(0x148, PIN_INPUT, 4) /* (AA26) PRG0_PRU1_GPO18.SPI3_D0 */
    			J721E_IOPAD(0x14c, PIN_INPUT, 4) /* (AA29) PRG0_PRU1_GPO19.SPI3_D1 */
    		>;
    	};
    
    	/* Add for A2 Sample AG568N <---> TDA4 SPI5 */
    	main_spi5_pins_default: main_spi5-default-pins {
    		pinctrl-single,pins = <
    			J721E_IOPAD(0x1a0, PIN_INPUT, 3) /* (W29) RGMII6_TXC.SPI5_CLK */
    			J721E_IOPAD(0x1b4, PIN_INPUT, 3) /* (W25) RGMII6_RD0.SPI5_CS1 */
    			J721E_IOPAD(0x198, PIN_INPUT, 3) /* (V25) RGMII6_TD1.SPI5_D0 */
    			J721E_IOPAD(0x1b0, PIN_INPUT, 3) /* (W24) RGMII6_RD1.SPI5_D1 */
    		>;
    	};
    
    	// add
    	main_system0_pins_default: main-system0-default-pins {
    		pinctrl-single,pins = <
    			J721E_IOPAD(0x278, PIN_OUTPUT, 0) /* (T6) RESETSTATz */
    			J721E_IOPAD(0x280, PIN_INPUT, 0) /* (U4) SOC_SAFETY_ERRORn */
    		>;
    	};
    
    	/* AG190W Uart3 <----> TDA4 Uart5 */
    	main_uart5_pins_default: main-uart5-default-pins {
    		pinctrl-single,pins = <
    			J721E_IOPAD(0x1d4, PIN_INPUT, 3) /* (Y3) SPI1_CS0.UART5_RXD */
    			J721E_IOPAD(0x1d8, PIN_OUTPUT, 3) /* (W4) SPI1_CS1.UART5_TXD */
    		>;
    	};
    };
    
    &wkup_pmx0 {
    	/delete-node/ pmic-irq-default-pins;
    
    	mcu_fss0_ospi0_pins_default: mcu_fss0_ospi0-default-pins {
    		pinctrl-single,pins = <
    			J721E_WKUP_IOPAD(0x0, PIN_OUTPUT, 0) /* (E20) MCU_OSPI0_CLK */
    			J721E_WKUP_IOPAD(0x2c, PIN_OUTPUT, 0) /* (F19) MCU_OSPI0_CSn0 */
    			J721E_WKUP_IOPAD(0xc, PIN_INPUT, 0) /* (D20) MCU_OSPI0_D0 */
    			J721E_WKUP_IOPAD(0x10, PIN_INPUT, 0) /* (G19) MCU_OSPI0_D1 */
    			J721E_WKUP_IOPAD(0x14, PIN_INPUT, 0) /* (G20) MCU_OSPI0_D2 */
    			J721E_WKUP_IOPAD(0x18, PIN_INPUT, 0) /* (F20) MCU_OSPI0_D3 */
    			J721E_WKUP_IOPAD(0x1c, PIN_INPUT, 0) /* (F21) MCU_OSPI0_D4 */
    			J721E_WKUP_IOPAD(0x20, PIN_INPUT, 0) /* (E21) MCU_OSPI0_D5 */
    			J721E_WKUP_IOPAD(0x24, PIN_INPUT, 0) /* (B22) MCU_OSPI0_D6 */
    			J721E_WKUP_IOPAD(0x28, PIN_INPUT, 0) /* (G21) MCU_OSPI0_D7 */
    			J721E_WKUP_IOPAD(0x8, PIN_INPUT, 0) /* (D21) MCU_OSPI0_DQS */
    			J721E_WKUP_IOPAD(0x3c, PIN_INPUT_PULLUP, 6) /* (B23) MCU_OSPI1_DQS.MCU_OSPI0_ECC_FAIL */
    			J721E_WKUP_IOPAD(0x38, PIN_OUTPUT_PULLUP, 6) /* (A23) MCU_OSPI1_LBCLKO.MCU_OSPI0_RESET_OUT0 */
    		>;
    	};
    
    	mcu_cpsw_pins_default: mcu-cpsw-default-pins {
    		pinctrl-single,pins = <
    			J721E_WKUP_IOPAD(0x0058, PIN_OUTPUT, 0) /* MCU_RGMII1_TX_CTL */
    			J721E_WKUP_IOPAD(0x005c, PIN_INPUT, 0) /* MCU_RGMII1_RX_CTL */
    			J721E_WKUP_IOPAD(0x0060, PIN_OUTPUT, 0) /* MCU_RGMII1_TD3 */
    			J721E_WKUP_IOPAD(0x0064, PIN_OUTPUT, 0) /* MCU_RGMII1_TD2 */
    			J721E_WKUP_IOPAD(0x0068, PIN_OUTPUT, 0) /* MCU_RGMII1_TD1 */
    			J721E_WKUP_IOPAD(0x006c, PIN_OUTPUT, 0) /* MCU_RGMII1_TD0 */
    			J721E_WKUP_IOPAD(0x0078, PIN_INPUT, 0) /* MCU_RGMII1_RD3 */
    			J721E_WKUP_IOPAD(0x007c, PIN_INPUT, 0) /* MCU_RGMII1_RD2 */
    			J721E_WKUP_IOPAD(0x0080, PIN_INPUT, 0) /* MCU_RGMII1_RD1 */
    			J721E_WKUP_IOPAD(0x0084, PIN_INPUT, 0) /* MCU_RGMII1_RD0 */
    			J721E_WKUP_IOPAD(0x0070, PIN_OUTPUT, 0) /* MCU_RGMII1_TXC */
    			J721E_WKUP_IOPAD(0x0074, PIN_INPUT, 0) /* MCU_RGMII1_RXC */
    		>;
    	};
    
    	// modify
    	// mcu_mdio_pins_default: mcu-mdio1-default-pins {
    	// 	pinctrl-single,pins = <
    	// 		J721E_WKUP_IOPAD(0x008c, PIN_OUTPUT, 0) /* MCU_MDIO0_MDC */
    	// 		J721E_WKUP_IOPAD(0x0088, PIN_INPUT, 0) /* MCU_MDIO0_MDIO */
    	// 	>;
    	// };
    	mcu_mdio_pins_default: mcu-mdio1-default-pins {
    		pinctrl-single,pins = <
    			J721E_WKUP_IOPAD(0x8c, PIN_OUTPUT, 0) /* (F23) MCU_MDIO0_MDC */
    			J721E_WKUP_IOPAD(0x88, PIN_INPUT, 0) /* (E23) MCU_MDIO0_MDIO */
    		>;
    	};
    
    	// wkup域gpio0的设备树具体内容需要各位老师确认,有需要则打开注释,最后仍保留注释部分将从设备树中删除
    	wkup_gpio_pins_default: wkup-gpio-default-pins {
    		pinctrl-single,pins = <
    	//		J721E_WKUP_IOPAD(0xbc, PIN_OUTPUT_PULLDOWN, 7) /* (F27) WKUP_GPIO0_3 */ /*pin Board_ID_EEPROM_WP  del 2025/02/25  */
    			J721E_WKUP_IOPAD(0xc8, PIN_INPUT, 7) /* (F29) WKUP_GPIO0_6 */
    	// 		J721E_WKUP_IOPAD(0xcc, PIN_OUTPUT, 7) /* (G28) WKUP_GPIO0_7 */
    	// 		J721E_WKUP_IOPAD(0xd0, PIN_INPUT, 7) /* (G27) WKUP_GPIO0_8 */
    	// 		J721E_WKUP_IOPAD(0xd4, PIN_INPUT, 7) /* (G26) WKUP_GPIO0_9 */
    	// 		J721E_WKUP_IOPAD(0xd8, PIN_INPUT, 7) /* (H26) WKUP_GPIO0_10 */
    	// 		J721E_WKUP_IOPAD(0xdc, PIN_OUTPUT, 7) /* (H27) WKUP_GPIO0_11 */
    	// 		J721E_WKUP_IOPAD(0x4, PIN_INPUT_PULLUP, 7) /* (C21) MCU_OSPI0_LBCLKO.WKUP_GPIO0_17 */
    	// 		J721E_WKUP_IOPAD(0x34, PIN_INPUT, 7) /* (F22) MCU_OSPI1_CLK.WKUP_GPIO0_29 */
    	// 		J721E_WKUP_IOPAD(0x44, PIN_OUTPUT, 7) /* (G22) MCU_OSPI1_D1.WKUP_GPIO0_33 */
    	// 		J721E_WKUP_IOPAD(0x48, PIN_INPUT, 7) /* (D23) MCU_OSPI1_D2.WKUP_GPIO0_34 */
    	// 		J721E_WKUP_IOPAD(0x4c, PIN_INPUT, 7) /* (C23) MCU_OSPI1_D3.WKUP_GPIO0_35 */
    	// 		J721E_WKUP_IOPAD(0x50, PIN_OUTPUT_PULLUP, 7) /* (C22) MCU_OSPI1_CSn0.WKUP_GPIO0_36 */
    	// 		J721E_WKUP_IOPAD(0x9c, PIN_INPUT, 7) /* (E25) MCU_SPI0_CS0.WKUP_GPIO0_55 */
    	// 		J721E_WKUP_IOPAD(0xf0, PIN_OUTPUT, 7) /* (D26) MCU_I3C0_SCL.WKUP_GPIO0_60 */
    	// 		J721E_WKUP_IOPAD(0xf4, PIN_OUTPUT, 7) /* (D25) MCU_I3C0_SDA.WKUP_GPIO0_61 */
    	//		J721E_WKUP_IOPAD(0x108, PIN_OUTPUT_PULLDOWN, 7) /* (E26) PMIC_POWER_EN0.WKUP_GPIO0_66 */  /*pin BOOT_EEPROM_WP  del 2025/02/25  */
    		>;
    	};
    
    
    	// add
    	mcu_rgmii1_pins_default: mcu-rgmii1-default-pins {
    		pinctrl-single,pins = <
    			J721E_WKUP_IOPAD(0x84, PIN_INPUT, 0) /* (B24) MCU_RGMII1_RD0 */
    			J721E_WKUP_IOPAD(0x80, PIN_INPUT, 0) /* (A24) MCU_RGMII1_RD1 */
    			J721E_WKUP_IOPAD(0x7c, PIN_INPUT, 0) /* (D24) MCU_RGMII1_RD2 */
    			J721E_WKUP_IOPAD(0x78, PIN_INPUT, 0) /* (A25) MCU_RGMII1_RD3 */
    			J721E_WKUP_IOPAD(0x74, PIN_INPUT, 0) /* (C24) MCU_RGMII1_RXC */
    			J721E_WKUP_IOPAD(0x5c, PIN_INPUT, 0) /* (C25) MCU_RGMII1_RX_CTL */
    			J721E_WKUP_IOPAD(0x6c, PIN_OUTPUT, 0) /* (B25) MCU_RGMII1_TD0 */
    			J721E_WKUP_IOPAD(0x68, PIN_OUTPUT, 0) /* (A26) MCU_RGMII1_TD1 */
    			J721E_WKUP_IOPAD(0x64, PIN_OUTPUT, 0) /* (A27) MCU_RGMII1_TD2 */
    			J721E_WKUP_IOPAD(0x60, PIN_OUTPUT, 0) /* (A28) MCU_RGMII1_TD3 */
    			J721E_WKUP_IOPAD(0x70, PIN_OUTPUT, 0) /* (B26) MCU_RGMII1_TXC */
    			J721E_WKUP_IOPAD(0x58, PIN_OUTPUT, 0) /* (B27) MCU_RGMII1_TX_CTL */
    		>;
    	};
    
    };
    
    &main_spi3 {
    	status = "okay";
    	pinctrl-names = "default";
    	pinctrl-0 = <&main_spi3_pins_default>;
    	spidev@0 {
    		compatible = "ti,spi-evm";
    		spi-max-frequency = <3125000>;
    		reg = <0>;
    		spi-cpol = <1>; // CPOL = 1
    		spi-cpha = <1>; // CPHA = 1
    	};
    	spidev@1 {
    		compatible = "ti,spi-evm";
    		spi-max-frequency = <3125000>;
    		reg = <1>;
    		spi-cpol = <0>; // CPOL = 0
    		spi-cpha = <1>; // CPHA = 1
    	};
    	spidev@2 {
    		compatible = "ti,spi-evm";
    		spi-max-frequency = <3125000>;
    		reg = <2>;
    		spi-cpol = <0>; // CPOL = 0
    		spi-cpha = <0>; // CPHA = 0
    		// interrupts = <GIC_SPI 90 IRQ_TYPE_EDGE_RISING>;
    	};
    	spidev@3 {
    		compatible = "ti,spi-evm";
    		spi-max-frequency = <3125000>;
    		reg = <3>;
    		spi-cpol = <0>; // CPOL = 0
    		spi-cpha = <1>; // CPHA = 1
    	};
    };
    
    &main_spi5 {
    	status = "okay";
    	pinctrl-names = "default";
    	pinctrl-0 = <&main_spi5_pins_default>;
    	spidev@0 {
    		compatible = "ti,spi-evm";
    		spi-max-frequency = <3125000>;
    		reg = <1>;
    		spi-cpol = <1>; // CPOL = 1
    		spi-cpha = <1>; // CPHA = 1
    	};
    };
    
    &wkup_uart0 {
    	/* Wakeup UART is used by System firmware */
    	status = "reserved";
    };
    
    &mcu_uart0 {
    	status = "reserved";
    
    };
    
    &{/} {
    	panel0 {
    		compatible = "simple-panel";
    		backlight = <&dsi941bridge>;
    		power-supply = <&dsi941bridge>;
    		port {
    			panel_in: endpoint {
    				remote-endpoint = <&panel_bridge_out>;
    			};
    		};
    	};
    };
    &main_i2c1 {
    	status = "okay";
    	pinctrl-names = "default";
    	pinctrl-0 = <&main_i2c1_pins_default>;
    	clock-frequency = <400000>;
    
    	a2b24xx: a2b24xx@0x68 {
    		compatible = "adi,a2b24xx";
    		reg = <0x68>;
    	};
    	dsi941bridge: dsi941bridge@0x16 {
    		compatible = "ti,ds90ub941";
    		reg = <0x16>;
    	};
    };
    
    &dss_ports {
    	#address-cells = <1>;
    	#size-cells = <0>;
    
    	port@2 {
    		reg = <2>;
    
    		dpi2_out: endpoint {
    			remote-endpoint = <&dsi0_in>;
    		};
    	};
    };
    
    &dphy2 {
    	status = "okay";
    };
    
    &dsi0 {
    	status = "okay";
    	#address-cells = <1>;
    	#size-cells = <0>;
    
    	ports {
    		#address-cells = <1>;
    		#size-cells = <0>;
    
    		port@0 {
    			reg = <0>;
    			dsi0_out: endpoint {
    				remote-endpoint = <&panel_bridge_in>;
    			};
    		};
    
    		port@1 {
    			reg = <1>;
    			dsi0_in: endpoint {
    				remote-endpoint = <&dpi2_out>;
    			};
    		};
    	};
    
    	bridge@0 {
    		compatible = "ti,ds90ub941br";
    		reg = <0>;
    		ports {
    			#address-cells = <1>;
    			#size-cells = <0>;
    
    			port@0 {
    				reg = <0>;
    				panel_bridge_in: endpoint {
    					remote-endpoint = <&dsi0_out>;
    				};
    			};
    
    			port@1 {
    				reg = <1>;
    				panel_bridge_out: endpoint {
    					remote-endpoint = <&panel_in>;
    				};
    			};
    		};
    	};
    
    };
    
    &main_uart0 {
    	status = "okay";
    	pinctrl-names = "default";
    	pinctrl-0 = <&main_uart0_pins_default>;
    	/* Shared with ATF on this platform */
    	power-domains = <&k3_pds 146 TI_SCI_PD_SHARED>;
    };
    
    &main_uart1 {
    	status = "disabled";
    };
    
    &main_uart2 {
    	status = "disabled";
    };
    
    &main_uart4 {
    	status = "disabled";
    };
    
    /* Add For AG190W Uart */
    &main_uart5 {
    	status = "okay";
    	pinctrl-names = "default";
    	pinctrl-0 = <&main_uart5_pins_default>;
    };
    
    &wkup_gpio0 {
    	status = "okay";
    	pinctrl-names = "default";
    	pinctrl-0 = <&wkup_gpio_pins_default>;
    };
    
    &main_gpio0 {
    	status = "okay";
    	pinctrl-names = "default";
    	pinctrl-0 = <&main_gpio0_pins_default>;
    };
    
    &main_gpio1 {
    	status = "okay";
    	pinctrl-names = "default";
    	pinctrl-0 = <&main_gpio1_pins_default>;
    };
    
    &main_sdhci0 {
    	/* eMMC */
    	status = "okay";
    	non-removable;
    	ti,driver-strength-ohm = <50>;
    	disable-wp;
    };
    
    &main_sdhci1 {
    	/* SD/MMC */
    	status = "okay";
    	pinctrl-names = "default";
    	pinctrl-0 = <&main_mmc1_pins_default>;
    	ti,driver-strength-ohm = <50>;
    	disable-wp;
    	no-1-8-v;
    	sdhci-caps-mask = <0x8000000F 0x0>;
    
    };
    
    &ufs_wrapper {
    	status = "okay";
    	ufs@4e84000 {
    	/* ufs */
    	status = "okay";
    	freq-table-hz = <26000000 26000000>,      // 高速频率  
                    	<19200000 19200000>,      // 低速频率1  
                    	<19200000 19200000>;      // 低速频率2	
    	};
    };
    
    &serdes_ln_ctrl { /*disable serdes for cpsw9g*/
    	idle-states = <J721E_SERDES2_LANE0_PCIE2_LANE0>, <J721E_SERDES2_LANE1_PCIE2_LANE1>,
    		      <J721E_SERDES3_LANE0_USB3_0_SWAP>, <J721E_SERDES3_LANE1_USB3_0>,
    		      <J721E_SERDES4_LANE0_EDP_LANE0>, <J721E_SERDES4_LANE1_EDP_LANE1>,
    		      <J721E_SERDES4_LANE2_EDP_LANE2>, <J721E_SERDES4_LANE3_EDP_LANE3>;
    };
    
    &serdes_wiz3 {
    	typec-dir-gpios = <&main_gpio1 3 GPIO_ACTIVE_HIGH>;
    	typec-dir-debounce-ms = <700>;	/* TUSB321, tCCB_DEFAULT 133 ms */
    };
    
    &serdes3 {
    	serdes3_usb_link: phy@0 {
    		reg = <0>;
    		cdns,num-lanes = <2>;
    		#phy-cells = <0>;
    		cdns,phy-type = <PHY_TYPE_USB3>;
    		resets = <&serdes_wiz3 1>, <&serdes_wiz3 2>;
    		status = "disabled"; /*disable serdes for cpsw9g*/
    	};
    };
    
    
    &ospi0 {
    	status = "okay";
    	flash@0 {
    		cdns,read-delay = <4>;
    	};
    };
    
    &ospi1 {
    	status = "disabled";
    };
    
    &tscadc0 {
    	status = "okay";
    	adc {
    		ti,adc-channels = <0 1 2 3 4 5 6 7>;
    	};
    };
    
    &tscadc1 {
    	status = "okay";
    	adc {
    		ti,adc-channels = <0 1 2 3 4 5 6 7>;
    	};
    };
    
    /* conflict gpio delete for /dev/gpiochip0 */
    // &k3_clks {
    // 	/* Confiure AUDIO_EXT_REFCLK2 pin as output */
    // 	pinctrl-names = "default";
    // 	pinctrl-0 = <&audi_ext_refclk2_pins_default>;
    // };
    
    &mcu_cpsw {
    	pinctrl-names = "default";
    	pinctrl-0 = <&mcu_cpsw_pins_default>, <&mcu_mdio_pins_default>;
    
    	cpts@3d000 {
    		/* Map HW4_TS_PUSH to GENF1 */
    		ti,pps = <3 1>;
    	};
    };
    
    &davinci_mdio {
    	phy2: ethernet-phy@2 {
    		reg = <2>;
    		mv88q2220-reset-gpios = <&main_gpio0 76 GPIO_ACTIVE_HIGH>;
    		reset-assert-us = <10000>;	// 10ms
    		reset-deassert-us = <10000>;	// 10ms
    	};
    };
    
    &cpsw_port1 {
    	phy-mode = "rgmii-rxid";
    	phy-handle = <&phy2>;
    };
    
    &dss {
    	/*
    	 * These clock assignments are chosen to enable the following outputs:
    	 *
    	 * VP0 - DisplayPort SST
    	 * VP1 - DPI0
    	 * VP2 - DSI
    	 * VP3 - DPI1
    	 */
    
    	assigned-clocks = <&k3_clks 152 1>,
    			  <&k3_clks 152 4>,
    			  <&k3_clks 152 9>,
    			  <&k3_clks 152 13>;
    	assigned-clock-parents = <&k3_clks 152 2>,	/* PLL16_HSDIV0 */
    				 <&k3_clks 152 6>,	/* PLL19_HSDIV0 */
    				 <&k3_clks 152 11>,	/* PLL18_HSDIV0 */
    				 <&k3_clks 152 18>;	/* PLL23_HSDIV0 */
    };
    
    &dss_ports {
    	port {
    		dpi0_out: endpoint {
    			remote-endpoint = <&dp0_in>;
    		};
    	};
    };
    
    &dp0_ports {
    	#address-cells = <1>;
    	#size-cells = <0>;
    
    	port@0 {
    		reg = <0>;
    		dp0_in: endpoint {
    			remote-endpoint = <&dpi0_out>;
    		};
    	};
    
    	port@4 {
    		reg = <4>;
    		dp0_out: endpoint {
    			remote-endpoint = <&dp_connector_in>;
    		};
    	};
    };
    
    &mcasp1 {
    	status = "okay";
    	#sound-dai-cells = <0>;
    
    	pinctrl-names = "default";
    	pinctrl-0 = <&main_mcasp1_pins_default>;
    
    	op-mode = <0>;          /* MCASP_IIS_MODE */
    	tdm-slots = <2>;
    	auxclk-fs-ratio = <256>;
    
    	serial-dir = <	/* 0: INACTIVE, 1: TX, 2: RX */
    		0 0 2 2
    		0 0 1 1
    		0 0 0 0
    	>;
    	tx-num-evt = <0>;
    	rx-num-evt = <0>;
    };
    
    
    &cmn_refclk1 {
    	clock-frequency = <100000000>;
    };
    
    &wiz0_pll1_refclk {
    	assigned-clocks = <&wiz0_pll1_refclk>;
    	assigned-clock-parents = <&cmn_refclk1>;
    	status = "disabled";/*disable serdes for cpsw9g*/
    };
    
    &wiz0_refclk_dig {
    	assigned-clocks = <&wiz0_refclk_dig>;
    	assigned-clock-parents = <&cmn_refclk1>;
    	status = "disabled";
    };
    
    &wiz1_pll1_refclk {
    	assigned-clocks = <&wiz1_pll1_refclk>;
    	assigned-clock-parents = <&cmn_refclk1>;
    	status = "disabled";
    };
    
    &wiz1_refclk_dig {
    	assigned-clocks = <&wiz1_refclk_dig>;
    	assigned-clock-parents = <&cmn_refclk1>;
    	status = "disabled";
    };
    
    &wiz2_pll1_refclk {
    	assigned-clocks = <&wiz2_pll1_refclk>;
    	assigned-clock-parents = <&cmn_refclk1>;
    	status = "disabled";
    };
    
    &wiz2_refclk_dig {
    	assigned-clocks = <&wiz2_refclk_dig>;
    	assigned-clock-parents = <&cmn_refclk1>;
    	status = "disabled";
    };
    
    &serdes0 {
    	assigned-clocks = <&serdes0 CDNS_SIERRA_PLL_CMNLC>;
    	assigned-clock-parents = <&wiz0_pll1_refclk>;
    
    	serdes0_pcie_link: phy@0 {
    		reg = <0>;
    		cdns,num-lanes = <1>;
    		#phy-cells = <0>;
    		cdns,phy-type = <PHY_TYPE_PCIE>;
    		resets = <&serdes_wiz0 1>;
    		status = "disabled";
    	};
    };
    
    &serdes1 {
    	assigned-clocks = <&serdes1 CDNS_SIERRA_PLL_CMNLC>;
    	assigned-clock-parents = <&wiz1_pll1_refclk>;
    
    	serdes1_pcie_link: phy@0 {
    		reg = <0>;
    		cdns,num-lanes = <2>;
    		#phy-cells = <0>;
    		cdns,phy-type = <PHY_TYPE_PCIE>;
    		resets = <&serdes_wiz1 1>, <&serdes_wiz1 2>;
    		status = "disabled";
    	};
    };
    /*disable serdes for cpsw9g*/
    &serdes_wiz0 {
    	status = "disabled";
    };
    
    &serdes_wiz1 {
    	status = "disabled";
    };
    
    &serdes_wiz2 {
    	status = "disabled";
    };
    
    &serdes_wiz3 {
    	status = "disabled";
    };
    
    &serdes2 {
    	assigned-clocks = <&serdes2 CDNS_SIERRA_PLL_CMNLC>;
    	assigned-clock-parents = <&wiz2_pll1_refclk>;
    
    	serdes2_pcie_link: phy@0 {
    		reg = <0>;
    		cdns,num-lanes = <2>;
    		#phy-cells = <0>;
    		cdns,phy-type = <PHY_TYPE_PCIE>;
    		resets = <&serdes_wiz2 1>, <&serdes_wiz2 2>;
    		status = "disabled";/*disable serdes for cpsw9g*/
    	};
    };
    
    &serdes4 {
    	torrent_phy_dp: phy@0 {
    		reg = <0>;
    		resets = <&serdes_wiz4 1>;
    		cdns,phy-type = <PHY_TYPE_DP>;
    		cdns,num-lanes = <4>;
    		cdns,max-bit-rate = <2700>;
    		#phy-cells = <0>;
    	};
    };
    
    &mhdp {
    	phys = <&torrent_phy_dp>;
    	phy-names = "dpphy";
    	pinctrl-names = "default";
    	pinctrl-0 = <&dp0_pins_default>;
    };
    
    &pcie0_rc {
    	status = "okay";
    	//reset-gpios = <&exp1 6 GPIO_ACTIVE_HIGH>;
    	phys = <&serdes0_pcie_link>;
    	phy-names = "pcie-phy";
    	num-lanes = <1>;
    };
    
    &pcie1_rc {
    	status = "okay";
    	//reset-gpios = <&exp1 2 GPIO_ACTIVE_HIGH>;
    	phys = <&serdes1_pcie_link>;
    	phy-names = "pcie-phy";
    	num-lanes = <2>;
    };
    
    &pcie2_rc {
    	status = "okay";
    	//reset-gpios = <&exp2 20 GPIO_ACTIVE_HIGH>;
    	phys = <&serdes2_pcie_link>;
    	phy-names = "pcie-phy";
    	num-lanes = <2>;
    };
    
    #define K3_TS_OFFSET(pa, val)	(0x4+(pa)*4) (0x10000 | val)
    
    &timesync_router {
    	status = "okay";
    	pinctrl-names = "default";
    	pinctrl-0 = <&mcu_cpsw_cpts>;
    
    	/* Use Time Sync Router to map GENF1 input to HW4_TS_PUSH output */
    	mcu_cpsw_cpts: mcu-cpsw-cpts {
    		pinctrl-single,pins = <
    			/* pps [mcu cpsw cpts genf1] in17 -> out25 [mcu cpsw cpts hw4_push] */
    			K3_TS_OFFSET(25, 17)
    			>;
    	};
    };
    
    &wkup_i2c0 {
    	/delete-node/ eeprom@50;
    	/delete-node/ pmic@48;
    	/delete-node/ pmic@4c;
    	/*status = "reserved";*/
    };
    
    &cbass_main {
    	phy@4580000 {
                    status = "disable";
                    };
    
    	phy@4590000 {
                    status = "disable";
                    };
    
    	dp-bridge@a000000  {
                    status = "disable";
                    };
    };
    

    The ds90ub941.c file is as follows. 

    // SPDX-License-Identifier: GPL-2.0
    /*
     * Copyright (c) 2018, The Linux Foundation. All rights reserved.
     * datasheet: https://www.ti.com/lit/ds/symlink/ds90ub941.pdf
     */
    
     #include <linux/atomic.h>
     #include <linux/auxiliary_bus.h>
     #include <linux/bitfield.h>
     #include <linux/bits.h>
     #include <linux/clk.h>
     #include <linux/debugfs.h>
     #include <linux/gpio/consumer.h>
     #include <linux/gpio/driver.h>
     #include <linux/i2c.h>
     #include <linux/iopoll.h>
     #include <linux/module.h>
     #include <linux/of_graph.h>
     #include <linux/pm_runtime.h>
     #include <linux/pwm.h>
     #include <linux/regmap.h>
     #include <linux/regulator/consumer.h>
     #include <linux/init.h>
     #include <linux/fs.h>
     #include <linux/uaccess.h>
     #include <linux/ioctl.h>
     #include <linux/major.h>
     #include <linux/platform_device.h>
    
     #include <asm/unaligned.h>
     
     #include <drm/display/drm_dp_aux_bus.h>
     #include <drm/display/drm_dp_helper.h>
     #include <drm/drm_atomic.h>
     #include <drm/drm_atomic_helper.h>
     #include <drm/drm_bridge.h>
     #include <drm/drm_bridge_connector.h>
     #include <drm/drm_edid.h>
     #include <drm/drm_mipi_dsi.h>
     #include <drm/drm_of.h>
     #include <drm/drm_panel.h>
     #include <drm/drm_print.h>
     #include <drm/drm_probe_helper.h>
     
     #define BOARD_FPD_UB941_GENERAL_STS_REG_ADDR                            (0x0CU)
     #define BOARD_FPD_UB948_GENERAL_STS_REG_ADDR                            (0x1CU)
    
    #define MY_DEVICE_MAGIC 's'
    #define DS90UB941_DEVICETEST     _IOR(MY_DEVICE_MAGIC, 1, int)
    #define DS90UB941_TESTCONNECT    _IOWR(MY_DEVICE_MAGIC, 2, int)
    
    /* PPI layer registers */
    #define PPI_STARTPPI		0x0104 /* START control bit */
    #define PPI_LPTXTIMECNT		0x0114 /* LPTX timing signal */
    #define PPI_D0S_ATMR		0x0144
    #define PPI_D1S_ATMR		0x0148
    #define PPI_D0S_CLRSIPOCOUNT	0x0164 /* Assertion timer for Lane 0 */
    #define PPI_D1S_CLRSIPOCOUNT	0x0168 /* Assertion timer for Lane 1 */
    #define PPI_START_FUNCTION	1
    
    /* DSI layer registers */
    #define DSI_STARTDSI		0x0204 /* START control bit of DSI-TX */
    #define DSI_LANEENABLE		0x0210 /* Enables each lane */
    #define DSI_RX_START		1
    
    /* LCDC/DPI Host Registers, based on guesswork that this matches TC358764 */
    #define LCDCTRL			0x0420 /* Video Path Control */
    #define LCDCTRL_MSF		BIT(0) /* Magic square in RGB666 */
    #define LCDCTRL_VTGEN		BIT(4)/* Use chip clock for timing */
    #define LCDCTRL_UNK6		BIT(6) /* Unknown */
    #define LCDCTRL_EVTMODE		BIT(5) /* Event mode */
    #define LCDCTRL_RGB888		BIT(8) /* RGB888 mode */
    #define LCDCTRL_HSPOL		BIT(17) /* Polarity of HSYNC signal */
    #define LCDCTRL_DEPOL		BIT(18) /* Polarity of DE signal */
    #define LCDCTRL_VSPOL		BIT(19) /* Polarity of VSYNC signal */
    #define LCDCTRL_VSDELAY(v)	(((v) & 0xfff) << 20) /* VSYNC delay */
    
    /* SPI Master Registers */
    #define SPICMR			0x0450
    #define SPITCR			0x0454
    
    /* System Controller Registers */
    #define SYSCTRL			0x0464
    
    /* System registers */
    #define LPX_PERIOD		3
    
    /* Lane enable PPI and DSI register bits */
    #define LANEENABLE_CLEN		BIT(0)
    #define LANEENABLE_L0EN		BIT(1)
    #define LANEENABLE_L1EN		BIT(2)
     
     struct ti_ds90ub941 {
    
         struct i2c_client	*client;
     
         struct device			*dev;
         struct regmap			*regmap;
        //  struct drm_bridge		bridge;
        //  struct drm_connector		*connector;
        //  struct device_node		*host_node;
        //  struct mipi_dsi_device		*dsi;
        //  struct clk			*refclk;
        //  struct drm_bridge		*next_bridge;
        //  struct gpio_desc		*enable_gpio;
        //  struct regulator_bulk_data	supplies[SN_REGULATOR_SUPPLY_NUM];
        //  int				dp_lanes;
        //  u8				ln_assign;
        //  u8				ln_polrs;
        //  bool				comms_enabled;
        //  bool				plugged;
     
        //  unsigned int			pwm_refclk_freq;
     };
     
     struct ti_ds90ub941_bridge {
    	struct device *dev;
    	struct drm_bridge bridge;
    	struct regulator *regulator;
    	struct drm_bridge *panel_bridge;
    	struct drm_display_mode mode;
    	bool pre_enabled;
    	int error;
    };
    
     u8 Ub941Config[][2] = {
        {0x01, 0x0A}, // Reset
        {0x03, 0x9A}, //Passthrough I2C
        {0x5B, 0x01}, //Force single lane
        {0x1E, 0x01}, //Select FPD-Link III Port 0
        {0x66, 0x1A},
        {0x67, 0x01}, //M=1
        {0x66, 0x03},
        {0x67, 0x03}, //N=2
        {0x66, 0x04},
        {0x67, 0x70}, //least 8 bit of Total Horizontal frame size
        {0x66, 0x05},
        {0x67, 0xE6}, //Least 4 bit TV + Most 4 bit TH
        {0x66, 0x06},
        {0x67, 0x2E}, //Most 8 bit of Total Vertical frame size
        {0x66, 0x07},
        {0x67, 0x00}, //least 8 bit of active Horizontal frame size
        {0x66, 0x08},
        {0x67, 0x05}, //Least 4 bit AV + Most 4 bit AH
        {0x66, 0x09},
        {0x67, 0x2D}, //Most 8 bit of active Vertical frame size
        {0x66, 0x0A},
        {0x67, 0x50}, //Horizontal Sync Width
        {0x66, 0x0B},
        {0x67, 0x05}, //Vertical Sync Width
        {0x66, 0x0C},
        {0x67, 0xD8}, //Horizontal back porch
        {0x66, 0x0D},
        {0x67, 0x16}, //Vertical back porch
        {0x65, 0x04}, //using internal timing and internal clock
        {0x64, 0x15}, //enable PG/color bars
        {0x1E, 0x01}, //Select FPD-Link III Port 0
        {0x07, 0x58}, //0x07,0x58
        {0x08, 0x5C}, //0x08,0x5c
        {0x03, 0x9A}, //0x03,0x9A Enable I2C_PASSTHROUGH, FPD-Link III Port 0
        {0x01, 0x00}, //Release DSI
    
     };
     static int major;
     static const struct class display941_class = {
    	.name = "display941",
    };
    //  static const struct regmap_range ti_ds90ub941_volatile_ranges[] = {
    //      { .range_min = 0, .range_max = 0xFF },
    //  };
     
    //  static const struct regmap_access_table ti_sn_bridge_volatile_table = {
    //      .yes_ranges = ti_ds90ub941_volatile_ranges,
    //      .n_yes_ranges = ARRAY_SIZE(ti_ds90ub941_volatile_ranges),
    //  };
     
     static const struct regmap_config ti_ds90ub941_regmap_config = {
         .reg_bits = 8,
         .val_bits = 8,
         .name = "ds90ub941",
        //  .volatile_table = &ti_sn_bridge_volatile_table,
        //  .cache_type = REGCACHE_NONE,
        //  .max_register = 0xFF,
     };
     
     static int ti_ds90ub941_read(struct ti_ds90ub941 *pdata, u8 reg, u8 *val)
     {
         int ret;
     
        //  ret = regmap_read(pdata->regmap, reg, &v);
        ret = i2c_smbus_read_i2c_block_data(pdata->client, reg, 1, val);
        if (ret < 0)
        {
           printk("DSS DSI ti_ds90ub941  Cannot read register 0x%02x: %d\n", reg, ret);
        } 
        else 
        {
           printk("DSS DSI ti_ds90ub941  read register 0x%02x: %d\n", reg, *val);
        }
     
         return ret;
     }
     
     static int ti_ds90ub941_write(struct ti_ds90ub941 *pdata, u8 reg, u8 val)
     {
         int ret;
        //  ret = regmap_write(pdata->regmap, reg, val);
        ret = i2c_smbus_write_byte_data(pdata->client, reg, val);
         if (ret)
         {
            printk("DSS DSI ti_ds90ub941  Cannot write register 0x%02x: %d\n", reg, ret);
         } 
         else 
         {
            printk("DSS DSI ti_ds90ub941  write register 0x%02x: %d\n", reg, val);
         }
             
         return ret;
     }
     
     static void ti_ds90ub941_cfg_init(struct ti_ds90ub941 *pdata)
     {
         int ret,cnt;
    
        for (cnt = 0; cnt < sizeof(Ub941Config)/2; cnt ++)
        {
            ret = ti_ds90ub941_write(pdata, Ub941Config[cnt][0], Ub941Config[cnt][1]);
            if (ret) {
                printk("DSS DSI ti_ds90ub941  Cannot write register 0x%02x: %d\n", Ub941Config[cnt][0], ret);
                break;
            }
         }
     
         usleep_range(10000, 10500); /* 10ms delay recommended by spec */
     }
    
     static int ti_ds90ub941_deviceTest(struct ti_ds90ub941 *pdata)
     {
         int ret;
         u8 val = 0;
    
         ret = ti_ds90ub941_read(pdata, BOARD_FPD_UB941_GENERAL_STS_REG_ADDR, &val);
         if (ret < 0) 
         {
            printk("ti_ds90ub941_deviceTest  test failed ret = %d",ret);
         } 
         else 
         {
            printk("ti_ds90ub941_deviceTest  test success ret = %d",ret);
         }
     
         usleep_range(10000, 10500); /* 10ms delay recommended by spec */
    
         return ret;
     }
    
     static int ti_ds90ub941_testConnect(struct ti_ds90ub941 *pdata, u8 subaddr)
     {
         int ret;
         unsigned short tmpaddr = pdata->client->addr;
         u8 val = 0;
    
         printk("ti_ds90ub941_testConnect addr 0x%02x\n", tmpaddr);
         pdata->client->addr = subaddr;
         printk("ti_ds90ub941_testConnect addr 0x%02x\n", pdata->client->addr);
         ret = ti_ds90ub941_read(pdata, BOARD_FPD_UB948_GENERAL_STS_REG_ADDR, &val);
    
         pdata->client->addr = tmpaddr;
    
         if (ret > 0)
         {
            if (0x02 == (val & 0x02))
            {
                ret = 0;
                printk("ti_ds90ub941_testConnect 948 connected\n");
            } else {
                ret = 1;
                printk("ti_ds90ub941_testConnect 948 disconnected ret = %d\n",ret);
            }    
         }
         else
         {
            printk("ti_ds90ub941_testConnect 948 disconnected ret = %d\n",ret);
         }
    
         usleep_range(10000, 10500); /* 10ms delay recommended by spec */
    
         return ret;
     }
     
    static long display_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) {
        int value;
        struct ti_ds90ub941 *ipdata = filp->private_data;
        int ret;
    
        switch (cmd) {
            case DS90UB941_DEVICETEST:
                // 处理读取数据的命令
                value = ti_ds90ub941_deviceTest(ipdata);
                if (copy_to_user((int *)arg, &value, sizeof(int))) {
                    return -EFAULT;
                }
                break;
            case DS90UB941_TESTCONNECT:
                // 处理读写数据的命令
    
                if (copy_from_user(&value, (int *)arg, sizeof(int))) {
                    return -EFAULT;
                }
                ret = ti_ds90ub941_testConnect(ipdata, (u8)value);
                if (copy_to_user((int *)arg, &ret, sizeof(int))) {
                    return -EFAULT;
                }
                break;
            default:
                return -ENOTTY; // 不支持的命令
        }
    
        return 0;
    }
    
    static struct file_operations my_device_fops = {
        .unlocked_ioctl = display_ioctl,
    };
    
    static int ti_ds90ub941_bridge_clear_error(struct ti_ds90ub941_bridge *ctx)
    {
    	int ret = ctx->error;
    
    	ctx->error = 0;
    	return ret;
    }
    
    static void ti_ds90ub941_bridge_write(struct ti_ds90ub941_bridge *ctx, u16 addr, u32 val)
    {
    	struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
    	ssize_t ret;
    	u8 data[6];
    
    	if (ctx->error)
    		return;
    
    	data[0] = addr;
    	data[1] = addr >> 8;
    	data[2] = val;
    	data[3] = val >> 8;
    	data[4] = val >> 16;
    	data[5] = val >> 24;
    
    	ret = mipi_dsi_generic_write(dsi, data, sizeof(data));
    	if (ret < 0)
    		ctx->error = ret;
    }
    
    static inline struct ti_ds90ub941_bridge *bridge_to_ti_ds90ub941_bridge(struct drm_bridge *bridge)
    {
    	return container_of(bridge, struct ti_ds90ub941_bridge, bridge);
    }
    
    static int ti_ds90ub941_bridge_init(struct ti_ds90ub941_bridge *ctx)
    {
    	u32 lcdctrl;
    
    	ti_ds90ub941_bridge_write(ctx, DSI_LANEENABLE,
    		       LANEENABLE_L0EN | LANEENABLE_CLEN);
    	ti_ds90ub941_bridge_write(ctx, PPI_D0S_CLRSIPOCOUNT, 5);
    	ti_ds90ub941_bridge_write(ctx, PPI_D1S_CLRSIPOCOUNT, 5);
    	ti_ds90ub941_bridge_write(ctx, PPI_D0S_ATMR, 0);
    	ti_ds90ub941_bridge_write(ctx, PPI_D1S_ATMR, 0);
    	ti_ds90ub941_bridge_write(ctx, PPI_LPTXTIMECNT, LPX_PERIOD);
    
    	ti_ds90ub941_bridge_write(ctx, SPICMR, 0x00);
    
    	lcdctrl = LCDCTRL_VSDELAY(1) | LCDCTRL_RGB888 |
    		  LCDCTRL_UNK6 | LCDCTRL_VTGEN;
    
    	if (ctx->mode.flags & DRM_MODE_FLAG_NHSYNC)
    		lcdctrl |= LCDCTRL_HSPOL;
    
    	if (ctx->mode.flags & DRM_MODE_FLAG_NVSYNC)
    		lcdctrl |= LCDCTRL_VSPOL;
    
    	ti_ds90ub941_bridge_write(ctx, LCDCTRL, lcdctrl);
    
    	ti_ds90ub941_bridge_write(ctx, SYSCTRL, 0x040f);
    	msleep(100);
    
    	ti_ds90ub941_bridge_write(ctx, PPI_STARTPPI, PPI_START_FUNCTION);
    	ti_ds90ub941_bridge_write(ctx, DSI_STARTDSI, DSI_RX_START);
    
    	msleep(100);
    
    	return ti_ds90ub941_bridge_clear_error(ctx);
    }
    
    static void ti_ds90ub941_bridge_post_disable(struct drm_bridge *bridge, struct drm_bridge_state *state)
    {
    	struct ti_ds90ub941_bridge *ctx = bridge_to_ti_ds90ub941_bridge(bridge);
    	int ret;
    
    	/*
    	 * The post_disable hook might be called multiple times.
    	 * We want to avoid regulator imbalance below.
    	 */
    	if (!ctx->pre_enabled)
    		return;
    
    	ctx->pre_enabled = false;
    
    	ret = regulator_disable(ctx->regulator);
    	if (ret < 0)
    		dev_err(ctx->dev, "error disabling regulators (%d)\n", ret);
    }
    
    static void ti_ds90ub941_bridge_pre_enable(struct drm_bridge *bridge, struct drm_bridge_state *state)
    {
    	struct ti_ds90ub941_bridge *ctx = bridge_to_ti_ds90ub941_bridge(bridge);
    	int ret;
    
    	ret = regulator_enable(ctx->regulator);
    	if (ret < 0)
    		dev_err(ctx->dev, "error enabling regulators (%d)\n", ret);
    
    	ctx->pre_enabled = true;
    }
    
    static void ti_ds90ub941_bridge_enable(struct drm_bridge *bridge, struct drm_bridge_state *state)
    {
    	struct ti_ds90ub941_bridge *ctx = bridge_to_ti_ds90ub941_bridge(bridge);
    	int ret;
    
    	ret = ti_ds90ub941_bridge_init(ctx);
    	if (ret < 0)
    		dev_err(ctx->dev, "error initializing bridge (%d)\n", ret);
    }
    
    static int ti_ds90ub941_bridge_attach(struct drm_bridge *bridge,
    			   enum drm_bridge_attach_flags flags)
    {
    	struct ti_ds90ub941_bridge *ctx = bridge_to_ti_ds90ub941_bridge(bridge);
    
    	return drm_bridge_attach(bridge->encoder, ctx->panel_bridge,
    				 bridge, flags);
    }
    
    static void ti_ds90ub941_bridge_bridge_mode_set(struct drm_bridge *bridge,
    				     const struct drm_display_mode *mode,
    				     const struct drm_display_mode *adj)
    {
    	struct ti_ds90ub941_bridge *ctx = bridge_to_ti_ds90ub941_bridge(bridge);
    
    	drm_mode_copy(&ctx->mode, mode);
    }
    
    static const struct drm_bridge_funcs ti_ds90ub941_bridge_bridge_funcs = {
    	.atomic_post_disable = ti_ds90ub941_bridge_post_disable,
    	.atomic_pre_enable = ti_ds90ub941_bridge_pre_enable,
    	.atomic_enable = ti_ds90ub941_bridge_enable,
    	.atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
    	.atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
    	.atomic_reset = drm_atomic_helper_bridge_reset,
    	.attach = ti_ds90ub941_bridge_attach,
    	.mode_set = ti_ds90ub941_bridge_bridge_mode_set,
    };
    
    static int ti_ds90ub941_bridge_parse_dt(struct ti_ds90ub941_bridge *ctx)
    {
    	struct drm_bridge *panel_bridge;
    	struct device *dev = ctx->dev;
    
    	panel_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 1, 0);
    	if (IS_ERR(panel_bridge))
    		return PTR_ERR(panel_bridge);
    
    	ctx->panel_bridge = panel_bridge;
    
    	return 0;
    }
    
    static int ti_ds90ub941_bridge_configure_regulators(struct ti_ds90ub941_bridge *ctx)
    {
    	ctx->regulator = devm_regulator_get(ctx->dev, "vddc");
    	if (IS_ERR(ctx->regulator))
    		return PTR_ERR(ctx->regulator);
    
    	return 0;
    }
     static int ti_ds90ub941_probe(struct i2c_client *client)
     {
         struct device *dev = &client->dev;
         struct ti_ds90ub941 *pdata;
     
    
         printk("DSS DSI ti_ds90ub941 START\n");
         if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
             printk("DSS DSI ti_ds90ub941 device doesn't support I2C\n");
             return -ENODEV;
         }
         printk("DSS DSI ti_ds90ub941 START1\n");
         pdata = devm_kzalloc(dev, sizeof(struct ti_ds90ub941), GFP_KERNEL);
         if (!pdata)
             return -ENOMEM;
         dev_set_drvdata(dev, pdata);
         pdata->dev = dev;
         pdata->client = client;
    
        //  pdata->enable_gpio = devm_gpiod_get_optional(dev, "enable",
    	// 					     GPIOD_OUT_HIGH);
     
         pdata->regmap = devm_regmap_init_i2c(client,
                              &ti_ds90ub941_regmap_config);
         
     
         ti_ds90ub941_cfg_init(pdata);
    
         usleep_range(10000, 10500); /* 10ms delay recommended by spec */
         /*
          * Break ourselves up into a collection of aux devices. The only real
          * motiviation here is to solve the chicken-and-egg problem of probe
          * ordering. The bridge wants the panel to be there when it probes.
          * The panel wants its HPD GPIO (provided by ds90ub941 on some boards)
          * when it probes. The panel and maybe backlight might want the DDC
          * bus or the pwm_chip. Having sub-devices allows the some sub devices
          * to finish probing even if others return -EPROBE_DEFER and gets us
          * around the problems.
          */
    
         printk("DSS DSI ti_ds90ub941 END\n");
         return 0;
     }
     
     static struct i2c_device_id ti_ds90ub941_id[] = {
         { "ti,ds90ub941", 0},
         {},
     };
     MODULE_DEVICE_TABLE(i2c, ti_ds90ub941_id);
     
     static const struct of_device_id ti_ds90ub941_match_table[] = {
         {.compatible = "ti,ds90ub941"},
         {},
     };
     MODULE_DEVICE_TABLE(of, ti_ds90ub941_match_table);
     
     static struct i2c_driver ti_ds90ub941_driver = {
         .driver = {
             .name = "ds90ub941",
             .of_match_table = ti_ds90ub941_match_table,
         },
         .probe = ti_ds90ub941_probe,
         .id_table = ti_ds90ub941_id,
     };
     
     static int ti_ds90ub941_bridge_probe(struct mipi_dsi_device *dsi)
     {
         struct device *dev = &dsi->dev;
         struct ti_ds90ub941_bridge *ctx;
         int ret;
     
         printk("ti_ds90ub941_bridge_probe start\n");
         ctx = devm_kzalloc(dev, sizeof(struct ti_ds90ub941_bridge), GFP_KERNEL);
         if (!ctx)
             return -ENOMEM;
     
         mipi_dsi_set_drvdata(dsi, ctx);
     
         ctx->dev = dev;
         ctx->pre_enabled = false;
     
         /* TODO: Find out how to get dual-lane mode working */
         dsi->lanes = 1;
         dsi->format = MIPI_DSI_FMT_RGB888;
         dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
                   MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_VIDEO_HSE;
     
         ret = ti_ds90ub941_bridge_parse_dt(ctx);
         if (ret < 0)
             return ret;
     
         ret = ti_ds90ub941_bridge_configure_regulators(ctx);
         if (ret < 0)
             return ret;
     
         ctx->bridge.funcs = &ti_ds90ub941_bridge_bridge_funcs;
         ctx->bridge.type = DRM_MODE_CONNECTOR_DPI;
         ctx->bridge.of_node = dev->of_node;
         ctx->bridge.pre_enable_prev_first = true;
     
         drm_bridge_add(&ctx->bridge);
     
         ret = mipi_dsi_attach(dsi);
         if (ret < 0) {
             drm_bridge_remove(&ctx->bridge);
             dev_err(dev, "failed to attach dsi\n");
         }
         printk("ti_ds90ub941_bridge_probe end\n");
    
         return ret;
     }
     
     static void ti_ds90ub941_bridge_remove(struct mipi_dsi_device *dsi)
     {
         struct ti_ds90ub941_bridge *ctx = mipi_dsi_get_drvdata(dsi);
     
         mipi_dsi_detach(dsi);
         drm_bridge_remove(&ctx->bridge);
     }
     
     static const struct of_device_id ti_ds90ub941_bridge_of_match[] = {
         { .compatible = "ti,ds90ub941br" },
         { }
     };
     MODULE_DEVICE_TABLE(of, ti_ds90ub941_bridge_of_match);
     
     static struct mipi_dsi_driver ti_ds90ub941_bridge_driver = {
         .probe = ti_ds90ub941_bridge_probe,
         .remove = ti_ds90ub941_bridge_remove,
         .driver = {
             .name = "ti_ds90ub941_bridge",
             .of_match_table = ti_ds90ub941_bridge_of_match,
         },
     };
    //  module_mipi_dsi_driver(ti_ds90ub941_bridge_driver);
    
     static int __init ti_ds90ub941_init(void)
     {
         int ret;
     
         ret = i2c_add_driver(&ti_ds90ub941_driver);
         if (ret)
             return ret;
    
         major = register_chrdev(0, "display941", &my_device_fops);
         if (major < 0) {
            printk(KERN_ALERT "Failed to register character device\n");
            return major;
         }
         printk(KERN_INFO "display941 registered with major number %d\n", major);
    
         ret = class_register(&display941_class);
    	 if (ret)
    	 	goto out_chrdev;
    	 device_create(&display941_class, NULL, MKDEV(major, 0), NULL,
    		      "display941");
    
        //  ret = mipi_dsi_driver_register(&ti_ds90ub941_bridge_driver);
    	//  if (ret < 0)
        //     printk("mipi_dsi_driver_register driver failed\n");
    
    	 printk("display941 driver installed\n");
    	 goto out;
    
    
    
    out_chrdev:
    	unregister_chrdev(0, "display941");
        return ret;
    out:
    	return ret;
     }
    
     module_init(ti_ds90ub941_init);
     
     static void __exit ti_ds90ub941_exit(void)
     {
         i2c_del_driver(&ti_ds90ub941_driver);
         
         device_destroy(&display941_class, MKDEV(major, 0));
    	 class_unregister(&display941_class);
    	 unregister_chrdev(major, "display941");
        //  mipi_dsi_driver_unregister(&ti_ds90ub941_bridge_driver);
         printk(KERN_INFO "display941 unregistered\n");
     }
     module_exit(ti_ds90ub941_exit);
     
     MODULE_AUTHOR("Sandeep Panda <spanda@codeaurora.org>");
     MODULE_DESCRIPTION("ds90ub941 DSI to eDP bridge driver");
     MODULE_LICENSE("GPL v2");
     

    The result is still the same, and the log related to the 941 that I want has not been printed. Since it depends on the DRM module, the result of zcat /proc/config.gz | grep CONFIG_VIDEO_DS90UB941 is still CONFIG_VIDEO_DS90UB941=m.

    Regards,

    FuGuojia

  • Hi FuGuojia,

    CONFIG_VIDEO_DS90UB941=m is fine. "m" means "module", so the driver is built as a kernel module and will be loaded at boot time. "n" or if it is commented out then that means it is disabled. Building as kernel module should not cause issues. 

    Could you add this patch to enable more logs during probe for all of the drivers, and then share the logs?

    https://e2e.ti.com/cfs-file/__key/communityserver-discussions-components-files/791/4456.0001_2D00_Enable_2D00_debug_2D00_logs_2D00_for_2D00_device_2D00_driver_2D00_probing.patch

    Above patch should show that the drivers are being probed, and most likely being deferred due to some issues with configurations.

    Regards,

    Takuma

  • Hi Takuma

    I understand the meaning of the module CONFIG_VIDEO_DS90UB941=m. However, I want my module to be probed directly after the board is powered on,

    In this way, I don't need to use commands like modprobe or insmod for installation. Therefore, I need CONFIG_VIDEO_DS90UB941=y.

    In addition, I added the DEBUG definition in the dd.c file as required by your patch. The execution log of the code is as follows:

    display_0509.log

    I found that there is indeed an error in the DRM module.

    Regards,

    FuGuojia

  • Hi FuGuojia,

    Your logs were a bit unexpected. It looks like there are no probe attempts at all for the display pipeline. 

    Can you run this command and share the logs (if any):

    • find /sys/firmware/devicetree/base/__symbols__/ -iname "*panel*"

    This should print something out. If it is not printing anything out, then that would be an issue.

    Regards,

    Takuma

  • Hi Takuma

    I executed your command and found that there was log output. The results are as follows:

    root@j721e-evm:~# find /sys/firmware/devicetree/base/__symbols__/ -iname "*panel*"
    /sys/firmware/devicetree/base/__symbols__/panel_in
    /sys/firmware/devicetree/base/__symbols__/panel_bridge_in
    /sys/firmware/devicetree/base/__symbols__/panel_bridge_out
    root@j721e-evm:~#

    Regards,

    FuGuojia

  • Hi FuGuojia,

    Another strange log. That should have shown a "panel0" symbol, since your devicetree defines panel0 like below:

    	panel0 {
    		compatible = "simple-panel";
    		backlight = <&dsi941bridge>;
    		power-supply = <&dsi941bridge>;
    		port {
    			panel_in: endpoint {
    				remote-endpoint = <&panel_bridge_out>;
    			};
    		};
    	};

    The strange part is that the logs show the panel_in node which is a child of panel0, so panel0 should also exist. Maybe there is issue with devicetree?

    Can you share the compiled dtb file that is flashed onto the board? It should be somewhere under /boot/dtb/ti. If the default name is used, it should be  k3-j721e-common-proc-board.dtb.

    Regards,

    Takuma

  • Hi Takuma

     The compiled dtb file is as follows:

    k3-j721e-common-proc-board.log

    The.dtb file is not allowed to be added as an attachment. So I have changed the suffix from.dtb to.log.

    Please change it back to.dtb when you use it.

     

    Regards,

    FuGuojia

  • Hi FuGuojia,

    Thanks for the dtb, I can also confirm that it does contain panel0. 

    As discussed in yesterday's meeting, I think we need to revisit the 0001-Enable-debug-logs-for-device-driver-probing.patch.

    What you should see when enabling the debug log in dd.c are logs like below in dmesg:

    root@j721e-evm:~# dmesg | grep probe
    [    1.114192] bus: 'i2c': __driver_probe_device: matched device 1-0020 with driver pca953x
    [    1.114200] bus: 'i2c': really_probe: probing driver pca953x with device 1-0020
    [    1.147790] bus: 'i2c': really_probe: bound device 1-0020 to driver pca953x
    [    1.147910] bus: 'i2c': __driver_probe_device: matched device 1-0022 with driver pca953x
    [    1.147915] bus: 'i2c': really_probe: probing driver pca953x with device 1-0022
    [    1.159589] bus: 'i2c': really_probe: bound device 1-0022 to driver pca953x
    [    1.165237] bus: 'platform': really_probe: bound device 2000000.i2c to driver omap_i2c
    [    1.165259] bus: 'platform': __driver_probe_device: matched device 2010000.i2c with driver omap_i2c
    [    1.165264] bus: 'platform': really_probe: probing driver omap_i2c with device 2010000.i2c
    [    1.165852] bus: 'i2c': __driver_probe_device: matched device 2-0020 with driver pca953x
    [    1.171561] bus: 'platform': really_probe: bound device 2010000.i2c to driver omap_i2c
    [    1.171582] bus: 'platform': __driver_probe_device: matched device 2030000.i2c with driver omap_i2c
    [    1.171586] bus: 'platform': really_probe: probing driver omap_i2c with device 2030000.i2c
    [    1.172022] bus: 'i2c': __driver_probe_device: matched device 3-0020 with driver pca953x
    [    1.172028] bus: 'i2c': really_probe: probing driver pca953x with device 3-0020
    [    1.203546] bus: 'i2c': really_probe: bound device 3-0020 to driver pca953x
    [    1.209416] bus: 'platform': really_probe: bound device 2030000.i2c to driver omap_i2c
    [    1.209437] bus: 'platform': __driver_probe_device: matched device 2060000.i2c with driver omap_i2c
    [    1.209441] bus: 'platform': really_probe: probing driver omap_i2c with device 2060000.i2c
    [    1.209933] bus: 'i2c': __driver_probe_device: matched device 4-0020 with driver pca953x
    [    1.209940] bus: 'i2c': really_probe: probing driver pca953x with device 4-0020
    [    1.243551] bus: 'i2c': really_probe: bound device 4-0020 to driver pca953x
    [    1.249196] bus: 'platform': really_probe: bound device 2060000.i2c to driver omap_i2c
    [    1.249229] bus: 'platform': __driver_probe_device: matched device 42200000.interrupt-controller with driver ti-sci-intr
    [    1.249233] bus: 'platform': really_probe: probing driver ti-sci-intr with device 42200000.interrupt-controller
    [    1.257794] bus: 'platform': really_probe: bound device 42200000.interrupt-controller to driver ti-sci-intr
    [    1.257817] bus: 'platform': __driver_probe_device: matched device bus@100000:interrupt-controller@a00000 with driver ti-sci-intr
    [    1.257820] bus: 'platform': really_probe: probing driver ti-sci-intr with device bus@100000:interrupt-controller@a00000
    [    1.267154] bus: 'platform': really_probe: bound device bus@100000:interrupt-controller@a00000 to driver ti-sci-intr
    [    1.267182] bus: 'platform': __driver_probe_device: matched device 310e0000.interrupt-controller with driver ti-sci-intr
    [    1.267186] bus: 'platform': really_probe: probing driver ti-sci-intr with device 310e0000.interrupt-controller
    [    1.275724] bus: 'platform': really_probe: bound device 310e0000.interrupt-controller to driver ti-sci-intr
    [    1.275740] bus: 'platform': __driver_probe_device: matched device 33d00000.interrupt-controller with driver ti-sci-inta
    [    1.275744] bus: 'platform': really_probe: probing driver ti-sci-inta with device 33d00000.interrupt-controller
    [    1.284717] bus: 'platform': really_probe: bound device 33d00000.interrupt-controller to driver ti-sci-inta
    [    1.284746] bus: 'platform': __driver_probe_device: matched device bus@100000:wiz@5000000 with driver wiz
    [    1.284750] bus: 'platform': really_probe: probing driver wiz with device bus@100000:wiz@5000000
    [    1.285551] bus: 'platform': __driver_probe_device: matched device 5000000.serdes with driver cdns-sierra-phy
    [    1.285597] bus: 'platform': really_probe: bound device bus@100000:wiz@5000000 to driver wiz
    [    1.285618] bus: 'platform': __driver_probe_device: matched device bus@100000:wiz@5010000 with driver wiz
    [    1.285622] bus: 'platform': really_probe: probing driver wiz with device bus@100000:wiz@5010000
    [    1.287720] bus: 'platform': __driver_probe_device: matched device 5010000.serdes with driver cdns-sierra-phy
    [    1.287756] bus: 'platform': really_probe: bound device bus@100000:wiz@5010000 to driver wiz
    [    1.287778] bus: 'platform': __driver_probe_device: matched device bus@100000:wiz@5020000 with driver wiz
    [    1.287782] bus: 'platform': really_probe: probing driver wiz with device bus@100000:wiz@5020000
    [    1.289920] bus: 'platform': __driver_probe_device: matched device 5020000.serdes with driver cdns-sierra-phy
    [    1.289958] bus: 'platform': really_probe: bound device bus@100000:wiz@5020000 to driver wiz
    [    1.289978] bus: 'platform': __driver_probe_device: matched device bus@100000:wiz@5030000 with driver wiz
    [    1.289982] bus: 'platform': really_probe: probing driver wiz with device bus@100000:wiz@5030000
    [    1.292107] bus: 'platform': __driver_probe_device: matched device 5030000.serdes with driver cdns-sierra-phy
    [    1.292144] bus: 'platform': really_probe: bound device bus@100000:wiz@5030000 to driver wiz
    [    1.292165] bus: 'platform': __driver_probe_device: matched device bus@100000:wiz@5050000 with driver wiz
    [    1.292169] bus: 'platform': really_probe: probing driver wiz with device bus@100000:wiz@5050000
    [    1.293934] bus: 'platform': __driver_probe_device: matched device 5050000.serdes with driver cdns-torrent-phy
    [    1.293965] bus: 'platform': really_probe: bound device bus@100000:wiz@5050000 to driver wiz
    [    1.293995] bus: 'platform': __driver_probe_device: matched device 2900000.pcie with driver j721e-pcie
    [    1.294031] bus: 'platform': __driver_probe_device: matched device 2910000.pcie with driver j721e-pcie
    [    1.294065] bus: 'platform': __driver_probe_device: matched device 2920000.pcie with driver j721e-pcie
    [    1.294098] bus: 'platform': __driver_probe_device: matched device 2930000.pcie with driver j721e-pcie
    [    1.294143] bus: 'platform': __driver_probe_device: matched device 285c0000.dma-controller with driver ti-udma
    [    1.294147] bus: 'platform': really_probe: probing driver ti-udma with device 285c0000.dma-controller
    [    1.294245] ti-udma 285c0000.dma-controller: Driver ti-udma requests probe deferral
    [    1.294396] bus: 'platform': __driver_probe_device: matched device 31150000.dma-controller with driver ti-udma
    [    1.294399] bus: 'platform': really_probe: probing driver ti-udma with device 31150000.dma-controller
    [    1.294495] ti-udma 31150000.dma-controller: Driver ti-udma requests probe deferral
    [    1.294584] bus: 'platform': __driver_probe_device: matched device 2b800000.ringacc with driver k3-ringacc
    [    1.294588] bus: 'platform': really_probe: probing driver k3-ringacc with device 2b800000.ringacc
    [    1.295085] k3-ringacc 2b800000.ringacc: Ring Accelerator probed rings:286, gp-rings[96,20] sci-dev-id:235
    [    1.319238] bus: 'platform': really_probe: bound device 2b800000.ringacc to driver k3-ringacc
    [    1.319276] bus: 'platform': __driver_probe_device: matched device 3c000000.ringacc with driver k3-ringacc
    [    1.319280] bus: 'platform': really_probe: probing driver k3-ringacc with device 3c000000.ringacc
    [    1.321565] k3-ringacc 3c000000.ringacc: Ring Accelerator probed rings:1024, gp-rings[440,150] sci-dev-id:211
    [    1.345990] bus: 'platform': really_probe: bound device 3c000000.ringacc to driver k3-ringacc
    [    1.346067] bus: 'platform': __driver_probe_device: matched device 40a00000.serial with driver omap8250
    [    1.346072] bus: 'platform': really_probe: probing driver omap8250 with device 40a00000.serial
    [    1.346643] bus: 'serial-base': __driver_probe_device: matched device 40a00000.serial:0 with driver ctrl
    [    1.346648] bus: 'serial-base': really_probe: probing driver ctrl with device 40a00000.serial:0
    [    1.346666] bus: 'serial-base': really_probe: bound device 40a00000.serial:0 to driver ctrl
    [    1.346689] bus: 'serial-base': __driver_probe_device: matched device 40a00000.serial:0.0 with driver port
    [    1.346692] bus: 'serial-base': really_probe: probing driver port with device 40a00000.serial:0.0
    [    1.346707] bus: 'serial-base': really_probe: bound device 40a00000.serial:0.0 to driver port
    [    1.355891] bus: 'platform': really_probe: bound device 40a00000.serial to driver omap8250
    [    1.355947] bus: 'platform': __driver_probe_device: matched device 2800000.serial with driver omap8250
    [    1.355952] bus: 'platform': really_probe: probing driver omap8250 with device 2800000.serial
    [    1.356347] bus: 'serial-base': __driver_probe_device: matched device 2800000.serial:0 with driver ctrl
    [    1.356352] bus: 'serial-base': really_probe: probing driver ctrl with device 2800000.serial:0
    [    1.356368] bus: 'serial-base': really_probe: bound device 2800000.serial:0 to driver ctrl
    [    1.356389] bus: 'serial-base': __driver_probe_device: matched device 2800000.serial:0.0 with driver port
    [    1.356393] bus: 'serial-base': really_probe: probing driver port with device 2800000.serial:0.0
    [    1.356406] bus: 'serial-base': really_probe: bound device 2800000.serial:0.0 to driver port
    [    1.387417] bus: 'platform': really_probe: bound device 2800000.serial to driver omap8250
    [    1.387477] bus: 'platform': __driver_probe_device: matched device 2810000.serial with driver omap8250
    [    1.387481] bus: 'platform': really_probe: probing driver omap8250 with device 2810000.serial
    [    1.387884] bus: 'serial-base': __driver_probe_device: matched device 2810000.serial:0 with driver ctrl
    [    1.387890] bus: 'serial-base': really_probe: probing driver ctrl with device 2810000.serial:0
    [    1.387908] bus: 'serial-base': really_probe: bound device 2810000.serial:0 to driver ctrl
    [    1.387932] bus: 'serial-base': __driver_probe_device: matched device 2810000.serial:0.0 with driver port
    [    1.387935] bus: 'serial-base': really_probe: probing driver port with device 2810000.serial:0.0
    [    1.387949] bus: 'serial-base': really_probe: bound device 2810000.serial:0.0 to driver port
    [    1.396722] bus: 'platform': really_probe: bound device 2810000.serial to driver omap8250
    [    1.396778] bus: 'platform': __driver_probe_device: matched device 2820000.serial with driver omap8250
    [    1.396782] bus: 'platform': really_probe: probing driver omap8250 with device 2820000.serial
    [    1.397153] bus: 'serial-base': __driver_probe_device: matched device 2820000.serial:0 with driver ctrl
    [    1.397158] bus: 'serial-base': really_probe: probing driver ctrl with device 2820000.serial:0
    [    1.397174] bus: 'serial-base': really_probe: bound device 2820000.serial:0 to driver ctrl
    [    1.397197] bus: 'serial-base': __driver_probe_device: matched device 2820000.serial:0.0 with driver port
    [    1.397201] bus: 'serial-base': really_probe: probing driver port with device 2820000.serial:0.0
    [    1.397214] bus: 'serial-base': really_probe: bound device 2820000.serial:0.0 to driver port
    [    1.405972] bus: 'platform': really_probe: bound device 2820000.serial to driver omap8250
    [    1.406021] bus: 'platform': __driver_probe_device: matched device 2840000.serial with driver omap8250
    [    1.406026] bus: 'platform': really_probe: probing driver omap8250 with device 2840000.serial
    [    1.406440] bus: 'serial-base': __driver_probe_device: matched device 2840000.serial:0 with driver ctrl
    [    1.406447] bus: 'serial-base': really_probe: probing driver ctrl with device 2840000.serial:0
    [    1.406464] bus: 'serial-base': really_probe: bound device 2840000.serial:0 to driver ctrl
    [    1.406494] bus: 'serial-base': __driver_probe_device: matched device 2840000.serial:0.0 with driver port
    [    1.406498] bus: 'serial-base': really_probe: probing driver port with device 2840000.serial:0.0
    [    1.406513] bus: 'serial-base': really_probe: bound device 2840000.serial:0.0 to driver port
    [    1.415274] bus: 'platform': really_probe: bound device 2840000.serial to driver omap8250
    [    1.415360] bus: 'platform': __driver_probe_device: matched device 47040000.spi with driver cadence-qspi
    [    1.415365] bus: 'platform': really_probe: probing driver cadence-qspi with device 47040000.spi
    [    1.416112] cadence-qspi 47040000.spi: Driver cadence-qspi requests probe deferral
    [    1.416312] bus: 'platform': __driver_probe_device: matched device 46000000.ethernet with driver am65-cpsw-nuss
    [    1.416318] bus: 'platform': really_probe: probing driver am65-cpsw-nuss with device 46000000.ethernet
    [    1.416662] bus: 'platform': __driver_probe_device: matched device 46000f00.mdio with driver davinci_mdio
    [    1.416666] bus: 'platform': really_probe: probing driver davinci_mdio with device 46000f00.mdio
    [    1.471469] bus: 'mdio_bus': __driver_probe_device: matched device 46000f00.mdio:00 with driver TI DP83867
    [    1.471476] bus: 'mdio_bus': really_probe: probing driver TI DP83867 with device 46000f00.mdio:00
    [    1.472807] bus: 'mdio_bus': really_probe: bound device 46000f00.mdio:00 to driver TI DP83867
    [    1.481082] bus: 'platform': really_probe: bound device 46000f00.mdio to driver davinci_mdio
    [    1.521137] am65-cpsw-nuss 46000000.ethernet: Driver am65-cpsw-nuss requests probe deferral
    [    1.521411] bus: 'platform': __driver_probe_device: matched device 310d0000.cpts with driver am65-cpts
    [    1.521417] bus: 'platform': really_probe: probing driver am65-cpts with device 310d0000.cpts
    [    1.530297] bus: 'platform': really_probe: bound device 310d0000.cpts to driver am65-cpts
    [    1.530401] platform 4fb0000.mmc: scheduling asynchronous probe
    [    1.530491] bus: 'platform': __driver_probe_device: matched device 4fb0000.mmc with driver sdhci-am654
    [    1.530498] platform 4f80000.mmc: scheduling asynchronous probe
    [    1.530506] platform 4fb0000.mmc: async probe completed
    [    1.530523] bus: 'platform': __driver_probe_device: matched device 42110000.gpio with driver davinci_gpio
    [    1.530528] bus: 'platform': really_probe: probing driver davinci_gpio with device 42110000.gpio
    [    1.530573] bus: 'platform': __driver_probe_device: matched device 4f80000.mmc with driver sdhci-am654
    [    1.530577] bus: 'platform': really_probe: probing driver sdhci-am654 with device 4f80000.mmc
    [    1.536531] bus: 'platform': really_probe: bound device 42110000.gpio to driver davinci_gpio
    [    1.536553] bus: 'platform': __driver_probe_device: matched device 600000.gpio with driver davinci_gpio
    [    1.536559] bus: 'platform': really_probe: probing driver davinci_gpio with device 600000.gpio
    [    1.539528] bus: 'platform': really_probe: bound device 600000.gpio to driver davinci_gpio
    [    1.539547] bus: 'platform': __driver_probe_device: matched device 601000.gpio with driver davinci_gpio
    [    1.539552] bus: 'platform': really_probe: probing driver davinci_gpio with device 601000.gpio
    [    1.540745] bus: 'platform': really_probe: bound device 601000.gpio to driver davinci_gpio
    [    1.540906] platform fixedregulator-sd: scheduling asynchronous probe
    [    1.540976] platform regulator-dp-pwr: scheduling asynchronous probe
    [    1.541038] platform gpio-regulator-TLV71033: scheduling asynchronous probe
    [    1.541085] bus: 'i2c': __driver_probe_device: matched device 0-0048 with driver tps6594
    [    1.541090] bus: 'i2c': really_probe: probing driver tps6594 with device 0-0048
    [    1.541368] bus: 'platform': __driver_probe_device: matched device fixedregulator-sd with driver reg-fixed-voltage
    [    1.541375] bus: 'platform': really_probe: probing driver reg-fixed-voltage with device fixedregulator-sd
    [    1.541425] bus: 'platform': __driver_probe_device: matched device regulator-dp-pwr with driver reg-fixed-voltage
    [    1.541441] platform regulator-dp-pwr: async probe completed
    [    1.541448] bus: 'platform': __driver_probe_device: matched device gpio-regulator-TLV71033 with driver gpio-regulator
    [    1.541452] bus: 'platform': really_probe: probing driver gpio-regulator with device gpio-regulator-TLV71033
    [    1.541866] bus: 'platform': really_probe: bound device gpio-regulator-TLV71033 to driver gpio-regulator
    [    1.541872] gpio-regulator gpio-regulator-TLV71033: async probe completed
    [    1.542006] bus: 'platform': really_probe: bound device fixedregulator-sd to driver reg-fixed-voltage
    [    1.542011] reg-fixed-voltage fixedregulator-sd: async probe completed
    [    1.567066] bus: 'platform': __driver_probe_device: matched device tps6594-regulator.0.auto with driver tps6594-regulator
    [    1.567074] bus: 'platform': really_probe: probing driver tps6594-regulator with device tps6594-regulator.0.auto
    [    1.581349] bus: 'platform': really_probe: bound device 4f80000.mmc to driver sdhci-am654
    [    1.581355] sdhci-am654 4f80000.mmc: async probe completed
    [    1.674841] bus: 'mmc': __driver_probe_device: matched device mmc0:0001 with driver mmcblk
    [    1.674847] bus: 'mmc': really_probe: probing driver mmcblk with device mmc0:0001
    [    1.699040] bus: 'mmc': really_probe: bound device mmc0:0001 to driver mmcblk
    [    1.713039] bus: 'platform': really_probe: bound device tps6594-regulator.0.auto to driver tps6594-regulator
    [    1.713308] bus: 'platform': __driver_probe_device: matched device tps6594-pinctrl.1.auto with driver tps6594-pinctrl
    [    1.713314] bus: 'platform': really_probe: probing driver tps6594-pinctrl with device tps6594-pinctrl.1.auto
    [    1.714917] bus: 'platform': really_probe: bound device tps6594-pinctrl.1.auto to driver tps6594-pinctrl
    [    1.715391] bus: 'platform': __driver_probe_device: matched device tps6594-pfsm.2.auto with driver tps6594-pfsm
    [    1.715396] bus: 'platform': really_probe: probing driver tps6594-pfsm with device tps6594-pfsm.2.auto
    [    1.760998] bus: 'platform': really_probe: bound device tps6594-pfsm.2.auto to driver tps6594-pfsm
    [    1.761106] bus: 'platform': __driver_probe_device: matched device tps6594-esm.3.auto with driver tps6594-esm
    [    1.761111] bus: 'platform': really_probe: probing driver tps6594-esm with device tps6594-esm.3.auto
    [    1.764311] bus: 'platform': really_probe: bound device tps6594-esm.3.auto to driver tps6594-esm
    [    1.764419] bus: 'platform': __driver_probe_device: matched device tps6594-rtc.4.auto with driver tps6594-rtc
    [    1.764423] bus: 'platform': really_probe: probing driver tps6594-rtc with device tps6594-rtc.4.auto
    [    1.846401] bus: 'platform': __driver_probe_device: matched device alarmtimer.5.auto with driver alarmtimer
    [    1.846405] bus: 'platform': really_probe: probing driver alarmtimer with device alarmtimer.5.auto
    [    1.846422] bus: 'platform': really_probe: bound device alarmtimer.5.auto to driver alarmtimer
    [    1.860334] bus: 'platform': really_probe: bound device tps6594-rtc.4.auto to driver tps6594-rtc
    [    1.860381] bus: 'i2c': really_probe: bound device 0-0048 to driver tps6594
    [    1.860430] bus: 'i2c': __driver_probe_device: matched device 0-004c with driver tps6594
    [    1.860434] bus: 'i2c': really_probe: probing driver tps6594 with device 0-004c
    [    1.864711] bus: 'platform': __driver_probe_device: matched device tps6594-regulator.6.auto with driver tps6594-regulator
    [    1.864719] bus: 'platform': really_probe: probing driver tps6594-regulator with device tps6594-regulator.6.auto
    [    1.971597] bus: 'platform': really_probe: bound device tps6594-regulator.6.auto to driver tps6594-regulator
    [    1.971825] bus: 'platform': __driver_probe_device: matched device tps6594-pinctrl.7.auto with driver tps6594-pinctrl
    [    1.971830] bus: 'platform': really_probe: probing driver tps6594-pinctrl with device tps6594-pinctrl.7.auto
    [    1.973462] bus: 'platform': really_probe: bound device tps6594-pinctrl.7.auto to driver tps6594-pinctrl
    [    1.973893] bus: 'platform': __driver_probe_device: matched device tps6594-pfsm.8.auto with driver tps6594-pfsm
    [    1.973897] bus: 'platform': really_probe: probing driver tps6594-pfsm with device tps6594-pfsm.8.auto
    [    2.019490] bus: 'platform': really_probe: bound device tps6594-pfsm.8.auto to driver tps6594-pfsm
    [    2.019597] bus: 'platform': __driver_probe_device: matched device tps6594-esm.9.auto with driver tps6594-esm
    [    2.019601] bus: 'platform': really_probe: probing driver tps6594-esm with device tps6594-esm.9.auto
    [    2.022791] bus: 'platform': really_probe: bound device tps6594-esm.9.auto to driver tps6594-esm
    [    2.022906] bus: 'platform': __driver_probe_device: matched device tps6594-rtc.10.auto with driver tps6594-rtc
    [    2.022910] bus: 'platform': really_probe: probing driver tps6594-rtc with device tps6594-rtc.10.auto
    [    2.103649] tps6594-rtc: probe of tps6594-rtc.10.auto rejects match -19
    [    2.103721] bus: 'i2c': really_probe: bound device 0-004c to driver tps6594
    [    2.103754] bus: 'i2c': __driver_probe_device: matched device 2-0020 with driver pca953x
    [    2.103759] bus: 'i2c': really_probe: probing driver pca953x with device 2-0020
    [    2.135856] bus: 'i2c': really_probe: bound device 2-0020 to driver pca953x
    [    2.135893] bus: 'platform': __driver_probe_device: matched device 5000000.serdes with driver cdns-sierra-phy
    [    2.135898] bus: 'platform': really_probe: probing driver cdns-sierra-phy with device 5000000.serdes
    [    2.137418] bus: 'platform': really_probe: bound device 5000000.serdes to driver cdns-sierra-phy
    [    2.137456] bus: 'platform': __driver_probe_device: matched device 5010000.serdes with driver cdns-sierra-phy
    [    2.137461] bus: 'platform': really_probe: probing driver cdns-sierra-phy with device 5010000.serdes
    [    2.138998] bus: 'platform': really_probe: bound device 5010000.serdes to driver cdns-sierra-phy
    [    2.139031] bus: 'platform': __driver_probe_device: matched device 5020000.serdes with driver cdns-sierra-phy
    [    2.139035] bus: 'platform': really_probe: probing driver cdns-sierra-phy with device 5020000.serdes
    [    2.140673] bus: 'platform': really_probe: bound device 5020000.serdes to driver cdns-sierra-phy
    [    2.140712] bus: 'platform': __driver_probe_device: matched device 5030000.serdes with driver cdns-sierra-phy
    [    2.140716] bus: 'platform': really_probe: probing driver cdns-sierra-phy with device 5030000.serdes
    [    2.142310] bus: 'platform': really_probe: bound device 5030000.serdes to driver cdns-sierra-phy
    [    2.142344] bus: 'platform': __driver_probe_device: matched device 5050000.serdes with driver cdns-torrent-phy
    [    2.142348] bus: 'platform': really_probe: probing driver cdns-torrent-phy with device 5050000.serdes
    [    2.143342] bus: 'platform': really_probe: bound device 5050000.serdes to driver cdns-torrent-phy
    [    2.143388] bus: 'platform': __driver_probe_device: matched device 2900000.pcie with driver j721e-pcie
    [    2.143393] bus: 'platform': really_probe: probing driver j721e-pcie with device 2900000.pcie
    [    3.390988] bus: 'pci': __driver_probe_device: matched device 0000:00:00.0 with driver pcieport
    [    3.390993] bus: 'pci': really_probe: probing driver pcieport with device 0000:00:00.0
    [    3.397794] bus: 'pci_express': __driver_probe_device: matched device 0000:00:00.0:pcie001 with driver pcie_pme
    [    3.397798] bus: 'pci_express': really_probe: probing driver pcie_pme with device 0000:00:00.0:pcie001
    [    3.403683] bus: 'pci_express': really_probe: bound device 0000:00:00.0:pcie001 to driver pcie_pme
    [    3.403713] bus: 'pci_express': __driver_probe_device: matched device 0000:00:00.0:pcie002 with driver aer
    [    3.403717] bus: 'pci_express': really_probe: probing driver aer with device 0000:00:00.0:pcie002
    [    3.409519] bus: 'pci_express': really_probe: bound device 0000:00:00.0:pcie002 to driver aer
    [    3.409587] bus: 'pci': really_probe: bound device 0000:00:00.0 to driver pcieport
    [    3.409625] bus: 'platform': really_probe: bound device 2900000.pcie to driver j721e-pcie
    [    3.409672] bus: 'platform': __driver_probe_device: matched device 2910000.pcie with driver j721e-pcie
    [    3.409677] bus: 'platform': really_probe: probing driver j721e-pcie with device 2910000.pcie
    [    4.626896] bus: 'pci': __driver_probe_device: matched device 0001:00:00.0 with driver pcieport
    [    4.626901] bus: 'pci': really_probe: probing driver pcieport with device 0001:00:00.0
    [    4.633697] bus: 'pci_express': __driver_probe_device: matched device 0001:00:00.0:pcie001 with driver pcie_pme
    [    4.633701] bus: 'pci_express': really_probe: probing driver pcie_pme with device 0001:00:00.0:pcie001
    [    4.639576] bus: 'pci_express': really_probe: bound device 0001:00:00.0:pcie001 to driver pcie_pme
    [    4.639604] bus: 'pci_express': __driver_probe_device: matched device 0001:00:00.0:pcie002 with driver aer
    [    4.639608] bus: 'pci_express': really_probe: probing driver aer with device 0001:00:00.0:pcie002
    [    4.645413] bus: 'pci_express': really_probe: bound device 0001:00:00.0:pcie002 to driver aer
    [    4.645491] bus: 'pci': really_probe: bound device 0001:00:00.0 to driver pcieport
    [    4.645531] bus: 'platform': really_probe: bound device 2910000.pcie to driver j721e-pcie
    [    4.645580] bus: 'platform': __driver_probe_device: matched device 2920000.pcie with driver j721e-pcie
    [    4.645585] bus: 'platform': really_probe: probing driver j721e-pcie with device 2920000.pcie
    [    5.865950] bus: 'pci': __driver_probe_device: matched device 0002:00:00.0 with driver pcieport
    [    5.865956] bus: 'pci': really_probe: probing driver pcieport with device 0002:00:00.0
    [    5.872757] bus: 'pci_express': __driver_probe_device: matched device 0002:00:00.0:pcie001 with driver pcie_pme
    [    5.872762] bus: 'pci_express': really_probe: probing driver pcie_pme with device 0002:00:00.0:pcie001
    [    5.878639] bus: 'pci_express': really_probe: bound device 0002:00:00.0:pcie001 to driver pcie_pme
    [    5.878668] bus: 'pci_express': __driver_probe_device: matched device 0002:00:00.0:pcie002 with driver aer
    [    5.878672] bus: 'pci_express': really_probe: probing driver aer with device 0002:00:00.0:pcie002
    [    5.884479] bus: 'pci_express': really_probe: bound device 0002:00:00.0:pcie002 to driver aer
    [    5.884559] bus: 'pci': really_probe: bound device 0002:00:00.0 to driver pcieport
    [    5.884597] bus: 'platform': really_probe: bound device 2920000.pcie to driver j721e-pcie
    [    5.884644] bus: 'platform': __driver_probe_device: matched device 2930000.pcie with driver j721e-pcie
    [    5.884648] bus: 'platform': really_probe: probing driver j721e-pcie with device 2930000.pcie
    [    6.997573] bus: 'pci': __driver_probe_device: matched device 0003:00:00.0 with driver pcieport
    [    6.997577] bus: 'pci': really_probe: probing driver pcieport with device 0003:00:00.0
    [    7.004371] bus: 'pci_express': __driver_probe_device: matched device 0003:00:00.0:pcie001 with driver pcie_pme
    [    7.004375] bus: 'pci_express': really_probe: probing driver pcie_pme with device 0003:00:00.0:pcie001
    [    7.010250] bus: 'pci_express': really_probe: bound device 0003:00:00.0:pcie001 to driver pcie_pme
    [    7.010279] bus: 'pci_express': __driver_probe_device: matched device 0003:00:00.0:pcie002 with driver aer
    [    7.010283] bus: 'pci_express': really_probe: probing driver aer with device 0003:00:00.0:pcie002
    [    7.016100] bus: 'pci_express': really_probe: bound device 0003:00:00.0:pcie002 to driver aer
    [    7.016179] bus: 'pci': really_probe: bound device 0003:00:00.0 to driver pcieport
    [    7.016218] bus: 'platform': really_probe: bound device 2930000.pcie to driver j721e-pcie
    [    7.016279] bus: 'platform': __driver_probe_device: matched device 285c0000.dma-controller with driver ti-udma
    [    7.016282] bus: 'platform': really_probe: probing driver ti-udma with device 285c0000.dma-controller
    [    7.026244] bus: 'platform': really_probe: bound device 285c0000.dma-controller to driver ti-udma
    [    7.026292] bus: 'platform': __driver_probe_device: matched device 31150000.dma-controller with driver ti-udma
    [    7.026296] bus: 'platform': really_probe: probing driver ti-udma with device 31150000.dma-controller
    [    7.039938] bus: 'platform': really_probe: bound device 31150000.dma-controller to driver ti-udma
    [    7.040061] bus: 'platform': __driver_probe_device: matched device 47040000.spi with driver cadence-qspi
    [    7.040068] bus: 'platform': really_probe: probing driver cadence-qspi with device 47040000.spi
    [    7.042635] bus: 'spi': __driver_probe_device: matched device spi0.0 with driver spi-nor
    [    7.042641] bus: 'spi': really_probe: probing driver spi-nor with device spi0.0
    [    7.165819] bus: 'spi': really_probe: bound device spi0.0 to driver spi-nor
    [    7.165869] bus: 'platform': really_probe: bound device 47040000.spi to driver cadence-qspi
    [    7.165993] bus: 'platform': __driver_probe_device: matched device 46000000.ethernet with driver am65-cpsw-nuss
    [    7.166000] bus: 'platform': really_probe: probing driver am65-cpsw-nuss with device 46000000.ethernet
    [    7.166401] bus: 'platform': __driver_probe_device: matched device 46000f00.mdio with driver davinci_mdio
    [    7.166406] bus: 'platform': really_probe: probing driver davinci_mdio with device 46000f00.mdio
    [    7.219482] bus: 'mdio_bus': __driver_probe_device: matched device 46000f00.mdio:00 with driver TI DP83867
    [    7.219488] bus: 'mdio_bus': really_probe: probing driver TI DP83867 with device 46000f00.mdio:00
    [    7.220816] bus: 'mdio_bus': really_probe: bound device 46000f00.mdio:00 to driver TI DP83867
    [    7.229094] bus: 'platform': really_probe: bound device 46000f00.mdio to driver davinci_mdio
    [    7.287852] bus: 'platform': really_probe: bound device 46000000.ethernet to driver am65-cpsw-nuss
    [    7.288020] platform 4fb0000.mmc: scheduling asynchronous probe
    [    7.288105] bus: 'platform': __driver_probe_device: matched device 4fb0000.mmc with driver sdhci-am654
    [    7.288113] bus: 'platform': really_probe: probing driver sdhci-am654 with device 4fb0000.mmc
    [    7.288114] platform regulator-dp-pwr: scheduling asynchronous probe
    [    7.288138] bus: 'platform': __driver_probe_device: matched device regulator-dp-pwr with driver reg-fixed-voltage
    [    7.288142] bus: 'platform': really_probe: probing driver reg-fixed-voltage with device regulator-dp-pwr
    [    7.291713] bus: 'platform': __driver_probe_device: matched device gpio-keys with driver gpio-keys
    [    7.292665] bus: 'platform': really_probe: probing driver gpio-keys with device gpio-keys
    [    7.293003] bus: 'platform': really_probe: bound device regulator-dp-pwr to driver reg-fixed-voltage
    [    7.299731] reg-fixed-voltage regulator-dp-pwr: async probe completed
    [    7.299836] bus: 'platform': really_probe: bound device gpio-keys to driver gpio-keys
    [    7.299914] Extended deferred probe timeout by 10 secs
    [    7.300049] Extended deferred probe timeout by 10 secs
    [    7.345406] bus: 'platform': really_probe: bound device 4fb0000.mmc to driver sdhci-am654
    [    7.345415] sdhci-am654 4fb0000.mmc: async probe completed
    [    7.351031] driver_probe_done: probe_count = 0
    [    7.363226] driver_probe_done: probe_count = 0
    [    7.379227] driver_probe_done: probe_count = 0
    [    7.395227] driver_probe_done: probe_count = 0
    [    7.399714] bus: 'mmc': __driver_probe_device: matched device mmc1:5048 with driver mmcblk
    [    7.399719] bus: 'mmc': really_probe: probing driver mmcblk with device mmc1:5048
    [    7.409466] bus: 'mmc': really_probe: bound device mmc1:5048 to driver mmcblk
    [    7.415240] driver_probe_done: probe_count = 0
    [    8.408501] systemd[1]: Created slice Slice /system/modprobe.
    [   11.995619] bus: 'platform': __driver_probe_device: matched device 2200000.watchdog with driver rti-wdt
    [   11.995647] bus: 'platform': really_probe: probing driver rti-wdt with device 2200000.watchdog
    [   12.019680] bus: 'platform': really_probe: bound device 2200000.watchdog to driver rti-wdt
    [   12.019704] bus: 'platform': __driver_probe_device: matched device 2210000.watchdog with driver rti-wdt
    [   12.019711] bus: 'platform': really_probe: probing driver rti-wdt with device 2210000.watchdog
    [   12.025662] bus: 'platform': really_probe: bound device 2210000.watchdog to driver rti-wdt
    [   12.025846] Extended deferred probe timeout by 10 secs
    [   12.119789] Extended deferred probe timeout by 10 secs
    [   12.148537] bus: 'platform': __driver_probe_device: matched device 4104000.cdns-usb with driver cdns3-ti
    [   12.155211] bus: 'platform': really_probe: probing driver cdns3-ti with device 4104000.cdns-usb
    [   12.159588] bus: 'platform': really_probe: bound device 4104000.cdns-usb to driver cdns3-ti
    [   12.159607] bus: 'platform': __driver_probe_device: matched device 4114000.cdns-usb with driver cdns3-ti
    [   12.159615] bus: 'platform': really_probe: probing driver cdns3-ti with device 4114000.cdns-usb
    [   12.167688] bus: 'platform': __driver_probe_device: matched device 2ba0000.mcasp with driver davinci-mcasp
    [   12.167706] bus: 'platform': really_probe: probing driver davinci-mcasp with device 2ba0000.mcasp
    [   12.182253] bus: 'platform': __driver_probe_device: matched device 40528000.can with driver m_can_platform
    [   12.220073] bus: 'platform': __driver_probe_device: matched device 40568000.can with driver m_can_platform
    [   12.220216] bus: 'platform': __driver_probe_device: matched device 2701000.can with driver m_can_platform
    [   12.220229] bus: 'platform': __driver_probe_device: matched device 2721000.can with driver m_can_platform
    [   12.220366] Extended deferred probe timeout by 10 secs
    [   12.221663] bus: 'platform': really_probe: bound device 4114000.cdns-usb to driver cdns3-ti
    [   12.221819] Extended deferred probe timeout by 10 secs
    [   12.221831] bus: 'platform': __driver_probe_device: matched device 40528000.can with driver m_can_platform
    [   12.221910] bus: 'platform': __driver_probe_device: matched device 40568000.can with driver m_can_platform
    [   12.221988] bus: 'platform': __driver_probe_device: matched device 2701000.can with driver m_can_platform
    [   12.222055] bus: 'platform': __driver_probe_device: matched device 2721000.can with driver m_can_platform
    [   12.235135] bus: 'i2c': __driver_probe_device: matched device 3-0044 with driver pcm3168a
    [   12.237605] bus: 'i2c': really_probe: probing driver pcm3168a with device 3-0044
    [   12.265228] bus: 'platform': __driver_probe_device: matched device 4d80800000.dsp with driver k3-dsp-rproc
    [   12.265257] bus: 'platform': __driver_probe_device: matched device 4d81800000.dsp with driver k3-dsp-rproc
    [   12.265268] bus: 'platform': __driver_probe_device: matched device 64800000.dsp with driver k3-dsp-rproc
    [   12.265468] Extended deferred probe timeout by 10 secs
    [   12.276193] bus: 'platform': __driver_probe_device: matched device 4e80000.ufs-wrapper with driver ti-j721e-ufs
    [   12.276216] bus: 'platform': really_probe: probing driver ti-j721e-ufs with device 4e80000.ufs-wrapper
    [   12.277169] bus: 'platform': really_probe: bound device 4e80000.ufs-wrapper to driver ti-j721e-ufs
    [   12.277272] bus: 'platform': __driver_probe_device: matched device 40528000.can with driver m_can_platform
    [   12.277303] Extended deferred probe timeout by 10 secs
    [   12.277350] bus: 'platform': __driver_probe_device: matched device 40568000.can with driver m_can_platform
    [   12.277421] bus: 'platform': __driver_probe_device: matched device 2701000.can with driver m_can_platform
    [   12.277490] bus: 'platform': __driver_probe_device: matched device 2721000.can with driver m_can_platform
    [   12.277566] bus: 'platform': __driver_probe_device: matched device 4d80800000.dsp with driver k3-dsp-rproc
    [   12.277641] bus: 'platform': __driver_probe_device: matched device 4d81800000.dsp with driver k3-dsp-rproc
    [   12.277715] bus: 'platform': __driver_probe_device: matched device 64800000.dsp with driver k3-dsp-rproc
    [   12.278667] bus: 'platform': __driver_probe_device: matched device 4e00000.crypto with driver saul-crypto
    [   12.278684] bus: 'platform': really_probe: probing driver saul-crypto with device 4e00000.crypto
    [   12.278894] bus: 'platform': __driver_probe_device: matched device 40528000.can with driver m_can_platform
    [   12.278973] bus: 'platform': __driver_probe_device: matched device 40568000.can with driver m_can_platform
    [   12.279049] bus: 'platform': __driver_probe_device: matched device 2701000.can with driver m_can_platform
    [   12.279121] bus: 'platform': __driver_probe_device: matched device 2721000.can with driver m_can_platform
    [   12.279202] bus: 'platform': __driver_probe_device: matched device 4d80800000.dsp with driver k3-dsp-rproc
    [   12.279648] bus: 'platform': __driver_probe_device: matched device 4d81800000.dsp with driver k3-dsp-rproc
    [   12.279736] bus: 'platform': __driver_probe_device: matched device 64800000.dsp with driver k3-dsp-rproc
    [   12.279950] bus: 'i2c': really_probe: bound device 3-0044 to driver pcm3168a
    [   12.280007] Extended deferred probe timeout by 10 secs
    [   12.347358] bus: 'platform': __driver_probe_device: matched device 42040000.temperature-sensor with driver k3-j72xx-soc-thermal
    [   12.347376] bus: 'platform': really_probe: probing driver k3-j72xx-soc-thermal with device 42040000.temperature-sensor
    [   12.350246] bus: 'platform': __driver_probe_device: matched device 4a00000.dss with driver tidss
    [   12.350262] bus: 'platform': really_probe: probing driver tidss with device 4a00000.dss
    [   12.354999] bus: 'platform': __driver_probe_device: matched device b000000.icssg with driver pruss
    [   12.355023] bus: 'platform': really_probe: probing driver pruss with device b000000.icssg
    [   12.358348] bus: 'platform': __driver_probe_device: matched device 40200000.tscadc with driver ti_am3359-tscadc
    [   12.358366] bus: 'platform': really_probe: probing driver ti_am3359-tscadc with device 40200000.tscadc
    [   12.393046] bus: 'platform': __driver_probe_device: matched device 40528000.can with driver m_can_platform
    [   12.393175] bus: 'platform': __driver_probe_device: matched device 40568000.can with driver m_can_platform
    [   12.393259] bus: 'platform': __driver_probe_device: matched device 2701000.can with driver m_can_platform
    [   12.393334] bus: 'platform': __driver_probe_device: matched device 2721000.can with driver m_can_platform
    [   12.393413] bus: 'platform': __driver_probe_device: matched device 4d80800000.dsp with driver k3-dsp-rproc
    [   12.393489] bus: 'platform': __driver_probe_device: matched device 4d81800000.dsp with driver k3-dsp-rproc
    [   12.393563] bus: 'platform': __driver_probe_device: matched device 64800000.dsp with driver k3-dsp-rproc
    [   12.393654] bus: 'platform': really_probe: bound device 42040000.temperature-sensor to driver k3-j72xx-soc-thermal
    [   12.393881] Extended deferred probe timeout by 10 secs
    [   12.408565] bus: 'i2c': __driver_probe_device: matched device 0-0050 with driver at24
    [   12.422312] tidss 4a00000.dss: Driver tidss requests probe deferral
    [   12.422425] bus: 'i2c': really_probe: probing driver at24 with device 0-0050
    [   12.438882] bus: 'platform': __driver_probe_device: matched device 40528000.can with driver m_can_platform
    [   12.438966] bus: 'platform': __driver_probe_device: matched device 40568000.can with driver m_can_platform
    [   12.439036] bus: 'platform': __driver_probe_device: matched device 2701000.can with driver m_can_platform
    [   12.439106] bus: 'platform': __driver_probe_device: matched device 2721000.can with driver m_can_platform
    [   12.439184] bus: 'platform': __driver_probe_device: matched device 4d80800000.dsp with driver k3-dsp-rproc
    [   12.439315] bus: 'platform': __driver_probe_device: matched device 4d81800000.dsp with driver k3-dsp-rproc
    [   12.439391] bus: 'platform': __driver_probe_device: matched device 64800000.dsp with driver k3-dsp-rproc
    [   12.439577] Extended deferred probe timeout by 10 secs
    [   12.440877] bus: 'platform': __driver_probe_device: matched device 4a00000.dss with driver tidss
    [   12.440893] bus: 'platform': really_probe: probing driver tidss with device 4a00000.dss
    [   12.459015] tidss 4a00000.dss: Driver tidss requests probe deferral
    [   12.459054] bus: 'platform': really_probe: bound device 40200000.tscadc to driver ti_am3359-tscadc
    [   12.459067] bus: 'platform': __driver_probe_device: matched device 40210000.tscadc with driver ti_am3359-tscadc
    [   12.459073] bus: 'platform': really_probe: probing driver ti_am3359-tscadc with device 40210000.tscadc
    [   12.480077] bus: 'platform': __driver_probe_device: matched device 40528000.can with driver m_can_platform
    [   12.480170] bus: 'platform': __driver_probe_device: matched device 40568000.can with driver m_can_platform
    [   12.480244] bus: 'platform': __driver_probe_device: matched device 2701000.can with driver m_can_platform
    [   12.480316] bus: 'platform': __driver_probe_device: matched device 2721000.can with driver m_can_platform
    [   12.480394] bus: 'platform': __driver_probe_device: matched device 4d80800000.dsp with driver k3-dsp-rproc
    [   12.480473] bus: 'platform': __driver_probe_device: matched device 4d81800000.dsp with driver k3-dsp-rproc
    [   12.480549] bus: 'platform': __driver_probe_device: matched device 64800000.dsp with driver k3-dsp-rproc
    [   12.480630] bus: 'platform': __driver_probe_device: matched device 4a00000.dss with driver tidss
    [   12.480635] bus: 'platform': really_probe: probing driver tidss with device 4a00000.dss
    [   12.486101] tidss 4a00000.dss: Driver tidss requests probe deferral
    [   12.491673] bus: 'platform': __driver_probe_device: matched device 4200000.video-encoder with driver img_enc
    [   12.491687] bus: 'platform': really_probe: probing driver img_enc with device 4200000.video-encoder
    [   12.507947] bus: 'platform': really_probe: bound device 40210000.tscadc to driver ti_am3359-tscadc
    [   12.508227] Extended deferred probe timeout by 10 secs
    [   12.508436] bus: 'platform': __driver_probe_device: matched device 40528000.can with driver m_can_platform
    [   12.508524] bus: 'platform': __driver_probe_device: matched device 40568000.can with driver m_can_platform
    [   12.508597] bus: 'platform': __driver_probe_device: matched device 2701000.can with driver m_can_platform
    [   12.508669] bus: 'platform': __driver_probe_device: matched device 2721000.can with driver m_can_platform
    [   12.508750] bus: 'platform': __driver_probe_device: matched device 4d80800000.dsp with driver k3-dsp-rproc
    [   12.508830] bus: 'platform': __driver_probe_device: matched device 4d81800000.dsp with driver k3-dsp-rproc
    [   12.508905] bus: 'platform': __driver_probe_device: matched device 64800000.dsp with driver k3-dsp-rproc
    [   12.508987] bus: 'platform': __driver_probe_device: matched device 4a00000.dss with driver tidss
    [   12.508991] bus: 'platform': really_probe: probing driver tidss with device 4a00000.dss
    [   12.512967] tidss 4a00000.dss: Driver tidss requests probe deferral
    [   12.518618] img_enc 4200000.video-encoder: vxe_enc_probe: using heap 1 for internal alloc
    [   12.528026] bus: 'platform': __driver_probe_device: matched device a000000.dp-bridge with driver cdns-mhdp8546
    [   12.528050] bus: 'platform': really_probe: probing driver cdns-mhdp8546 with device a000000.dp-bridge
    [   12.569328] bus: 'platform': really_probe: bound device b000000.icssg to driver pruss
    [   12.569352] bus: 'platform': __driver_probe_device: matched device b100000.icssg with driver pruss
    [   12.569362] bus: 'platform': really_probe: probing driver pruss with device b100000.icssg
    [   12.569598] bus: 'platform': __driver_probe_device: matched device 40528000.can with driver m_can_platform
    [   12.569685] bus: 'platform': __driver_probe_device: matched device 40568000.can with driver m_can_platform
    [   12.569758] bus: 'platform': __driver_probe_device: matched device 2701000.can with driver m_can_platform
    [   12.569828] bus: 'platform': __driver_probe_device: matched device 2721000.can with driver m_can_platform
    [   12.569907] bus: 'platform': __driver_probe_device: matched device 4d80800000.dsp with driver k3-dsp-rproc
    [   12.569987] bus: 'platform': __driver_probe_device: matched device 4d81800000.dsp with driver k3-dsp-rproc
    [   12.570441] bus: 'platform': __driver_probe_device: matched device 64800000.dsp with driver k3-dsp-rproc
    [   12.570587] bus: 'platform': __driver_probe_device: matched device 4a00000.dss with driver tidss
    [   12.570592] bus: 'platform': really_probe: probing driver tidss with device 4a00000.dss
    [   12.571983] bus: 'i2c': really_probe: bound device 0-0050 to driver at24
    [   12.572084] bus: 'platform': really_probe: bound device 4200000.video-encoder to driver img_enc
    [   12.572267] tidss 4a00000.dss: Driver tidss requests probe deferral
    [   12.574833] Extended deferred probe timeout by 10 secs
    [   12.576270] Extended deferred probe timeout by 10 secs
    [   12.577432] bus: 'platform': __driver_probe_device: matched device 40528000.can with driver m_can_platform
    [   12.577522] bus: 'platform': __driver_probe_device: matched device 40568000.can with driver m_can_platform
    [   12.577593] bus: 'platform': __driver_probe_device: matched device 2701000.can with driver m_can_platform
    [   12.577663] bus: 'platform': __driver_probe_device: matched device 2721000.can with driver m_can_platform
    [   12.577739] bus: 'platform': __driver_probe_device: matched device 4d80800000.dsp with driver k3-dsp-rproc
    [   12.577817] bus: 'platform': __driver_probe_device: matched device 4d81800000.dsp with driver k3-dsp-rproc
    [   12.577916] bus: 'platform': __driver_probe_device: matched device 64800000.dsp with driver k3-dsp-rproc
    [   12.578000] bus: 'platform': __driver_probe_device: matched device 4a00000.dss with driver tidss
    [   12.578004] bus: 'platform': really_probe: probing driver tidss with device 4a00000.dss
    [   12.656203] bus: 'platform': really_probe: bound device a000000.dp-bridge to driver cdns-mhdp8546
    [   12.656411] Extended deferred probe timeout by 10 secs
    [   12.656642] bus: 'platform': really_probe: bound device 2ba0000.mcasp to driver davinci-mcasp
    [   12.656748] Extended deferred probe timeout by 10 secs
    [   12.720473] bus: 'platform': __driver_probe_device: matched device 4e10000.rng with driver omap_rng
    [   12.720490] bus: 'platform': really_probe: probing driver omap_rng with device 4e10000.rng
    [   12.728496] bus: 'platform': __driver_probe_device: matched device 4300000.video-decoder with driver img_dec
    [   12.728515] bus: 'platform': really_probe: probing driver img_dec with device 4300000.video-decoder
    [   12.736402] bus: 'platform': __driver_probe_device: matched device 30e00000.spinlock with driver omap_hwspinlock
    [   12.736422] bus: 'platform': really_probe: probing driver omap_hwspinlock with device 30e00000.spinlock
    [   12.736631] bus: 'platform': really_probe: bound device 30e00000.spinlock to driver omap_hwspinlock
    [   12.736876] Extended deferred probe timeout by 10 secs
    [   12.788280] bus: 'platform': really_probe: bound device 4e10000.rng to driver omap_rng
    [   12.799538] bus: 'platform': really_probe: bound device 4a00000.dss to driver tidss
    [   12.799750] bus: 'platform': __driver_probe_device: matched device 40528000.can with driver m_can_platform
    [   12.799840] bus: 'platform': __driver_probe_device: matched device 40568000.can with driver m_can_platform
    [   12.799913] bus: 'platform': __driver_probe_device: matched device 2701000.can with driver m_can_platform
    [   12.799984] bus: 'platform': __driver_probe_device: matched device 2721000.can with driver m_can_platform
    [   12.800066] bus: 'platform': __driver_probe_device: matched device 4d80800000.dsp with driver k3-dsp-rproc
    [   12.800149] bus: 'platform': __driver_probe_device: matched device 4d81800000.dsp with driver k3-dsp-rproc
    [   12.800224] bus: 'platform': __driver_probe_device: matched device 64800000.dsp with driver k3-dsp-rproc
    [   12.812658] bus: 'platform': really_probe: bound device b100000.icssg to driver pruss
    [   12.812872] Extended deferred probe timeout by 10 secs
    [   12.813847] bus: 'platform': __driver_probe_device: matched device 40528000.can with driver m_can_platform
    [   12.813933] bus: 'platform': __driver_probe_device: matched device 40568000.can with driver m_can_platform
    [   12.814008] bus: 'platform': __driver_probe_device: matched device 2701000.can with driver m_can_platform
    [   12.814080] bus: 'platform': __driver_probe_device: matched device 2721000.can with driver m_can_platform
    [   12.814161] bus: 'platform': __driver_probe_device: matched device 4d80800000.dsp with driver k3-dsp-rproc
    [   12.814241] bus: 'platform': __driver_probe_device: matched device 4d81800000.dsp with driver k3-dsp-rproc
    [   12.814318] bus: 'platform': __driver_probe_device: matched device 64800000.dsp with driver k3-dsp-rproc
    [   12.814385] bus: 'platform': really_probe: bound device 4e00000.crypto to driver saul-crypto
    [   12.814677] Extended deferred probe timeout by 10 secs
    [   12.861380] bus: 'platform': __driver_probe_device: matched device bus@100000:bus@28380000:r5fss@41000000 with driver k3_r5_rproc
    [   12.861402] bus: 'platform': really_probe: probing driver k3_r5_rproc with device bus@100000:bus@28380000:r5fss@41000000
    [   13.093028] bus: 'platform': __driver_probe_device: matched device 40528000.can with driver m_can_platform
    [   13.093117] bus: 'platform': __driver_probe_device: matched device 40568000.can with driver m_can_platform
    [   13.093188] bus: 'platform': __driver_probe_device: matched device 2701000.can with driver m_can_platform
    [   13.093206] bus: 'platform': really_probe: bound device 4300000.video-decoder to driver img_dec
    [   13.093277] bus: 'platform': __driver_probe_device: matched device 2721000.can with driver m_can_platform
    [   13.093369] bus: 'platform': __driver_probe_device: matched device 4d80800000.dsp with driver k3-dsp-rproc
    [   13.093412] Extended deferred probe timeout by 10 secs
    [   13.093446] bus: 'platform': __driver_probe_device: matched device 4d81800000.dsp with driver k3-dsp-rproc
    [   13.093521] bus: 'platform': __driver_probe_device: matched device 64800000.dsp with driver k3-dsp-rproc
    [   13.099505] k3_r5_rproc bus@100000:bus@28380000:r5fss@41000000: Driver k3_r5_rproc requests probe deferral
    [   13.148226] bus: 'platform': __driver_probe_device: matched device 31f80000.mailbox with driver omap-mailbox
    [   13.176984] bus: 'platform': __driver_probe_device: matched device connector with driver display-connector
    [   13.186854] bus: 'platform': __driver_probe_device: matched device can-phy0 with driver can-transceiver-phy
    [   13.186873] bus: 'platform': really_probe: probing driver can-transceiver-phy with device can-phy0
    [   13.187881] bus: 'platform': __driver_probe_device: matched device 40528000.can with driver m_can_platform
    [   13.187890] bus: 'platform': really_probe: probing driver m_can_platform with device 40528000.can
    [   13.188018] bus: 'platform': really_probe: bound device can-phy0 to driver can-transceiver-phy
    [   13.188034] bus: 'platform': __driver_probe_device: matched device can-phy1 with driver can-transceiver-phy
    [   13.188040] bus: 'platform': really_probe: probing driver can-transceiver-phy with device can-phy1
    [   13.191205] bus: 'platform': really_probe: bound device can-phy1 to driver can-transceiver-phy
    [   13.199358] bus: 'platform': __driver_probe_device: matched device can-phy2 with driver can-transceiver-phy
    [   13.199370] bus: 'platform': really_probe: probing driver can-transceiver-phy with device can-phy2
    [   13.201876] bus: 'platform': really_probe: bound device can-phy2 to driver can-transceiver-phy
    [   13.201888] bus: 'platform': __driver_probe_device: matched device can-phy3 with driver can-transceiver-phy
    [   13.201895] bus: 'platform': really_probe: probing driver can-transceiver-phy with device can-phy3
    [   13.202398] bus: 'platform': really_probe: bound device can-phy3 to driver can-transceiver-phy
    [   13.203004] Extended deferred probe timeout by 10 secs
    [   13.203950] bus: 'platform': really_probe: bound device 40528000.can to driver m_can_platform
    [   13.204142] bus: 'platform': __driver_probe_device: matched device 40568000.can with driver m_can_platform
    [   13.204150] bus: 'platform': really_probe: probing driver m_can_platform with device 40568000.can
    [   13.223061] bus: 'platform': really_probe: bound device 40568000.can to driver m_can_platform
    [   13.223294] bus: 'platform': __driver_probe_device: matched device 2701000.can with driver m_can_platform
    [   13.223304] bus: 'platform': really_probe: probing driver m_can_platform with device 2701000.can
    [   13.228495] bus: 'platform': really_probe: probing driver omap-mailbox with device 31f80000.mailbox
    [   13.228608] bus: 'platform': really_probe: probing driver display-connector with device connector
    [   13.231613] bus: 'platform': __driver_probe_device: matched device bus@100000:r5fss@5c00000 with driver k3_r5_rproc
    [   13.231621] bus: 'platform': really_probe: probing driver k3_r5_rproc with device bus@100000:r5fss@5c00000
    [   13.246778] bus: 'platform': really_probe: bound device connector to driver display-connector
    [   13.248110] Extended deferred probe timeout by 10 secs
    [   13.249215] bus: 'platform': really_probe: bound device 31f80000.mailbox to driver omap-mailbox
    [   13.249231] bus: 'platform': __driver_probe_device: matched device 31f81000.mailbox with driver omap-mailbox
    [   13.249237] bus: 'platform': really_probe: probing driver omap-mailbox with device 31f81000.mailbox
    [   13.288978] bus: 'platform': really_probe: bound device 2701000.can to driver m_can_platform
    [   13.289147] bus: 'platform': __driver_probe_device: matched device 2721000.can with driver m_can_platform
    [   13.289154] bus: 'platform': really_probe: probing driver m_can_platform with device 2721000.can
    [   13.304665] bus: 'platform': really_probe: bound device 2721000.can to driver m_can_platform
    [   13.304842] bus: 'platform': __driver_probe_device: matched device 4d80800000.dsp with driver k3-dsp-rproc
    [   13.304925] bus: 'platform': __driver_probe_device: matched device 4d81800000.dsp with driver k3-dsp-rproc
    [   13.304999] bus: 'platform': __driver_probe_device: matched device 64800000.dsp with driver k3-dsp-rproc
    [   13.305093] bus: 'platform': __driver_probe_device: matched device bus@100000:bus@28380000:r5fss@41000000 with driver k3_r5_rproc
    [   13.305098] bus: 'platform': really_probe: probing driver k3_r5_rproc with device bus@100000:bus@28380000:r5fss@41000000
    [   13.323179] bus: 'platform': __driver_probe_device: matched device sound-0 with driver j721e-audio
    [   13.323202] bus: 'platform': really_probe: probing driver j721e-audio with device sound-0
    [   13.323558] bus: 'platform': really_probe: bound device 31f81000.mailbox to driver omap-mailbox
    [   13.323576] bus: 'platform': __driver_probe_device: matched device 31f82000.mailbox with driver omap-mailbox
    [   13.323582] bus: 'platform': really_probe: probing driver omap-mailbox with device 31f82000.mailbox
    [   13.386161] bus: 'platform': __driver_probe_device: matched device rproc-virtio.13.auto with driver rproc-virtio
    [   13.386174] bus: 'platform': really_probe: probing driver rproc-virtio with device rproc-virtio.13.auto
    [   13.386249] bus: 'platform': really_probe: bound device rproc-virtio.13.auto to driver rproc-virtio
    [   13.398819] bus: 'platform': really_probe: bound device sound-0 to driver j721e-audio
    [   13.398981] Extended deferred probe timeout by 10 secs
    [   13.402886] bus: 'virtio': __driver_probe_device: matched device virtio0 with driver virtio_rpmsg_bus
    [   13.402902] bus: 'virtio': really_probe: probing driver virtio_rpmsg_bus with device virtio0
    [   13.403320] bus: 'rpmsg': __driver_probe_device: matched device virtio0.rpmsg_ns.53.53 with driver rpmsg_ns
    [   13.403325] bus: 'rpmsg': really_probe: probing driver rpmsg_ns with device virtio0.rpmsg_ns.53.53
    [   13.403355] bus: 'rpmsg': really_probe: bound device virtio0.rpmsg_ns.53.53 to driver rpmsg_ns
    [   13.412946] bus: 'virtio': really_probe: bound device virtio0 to driver virtio_rpmsg_bus
    [   13.450794] bus: 'platform': really_probe: bound device bus@100000:bus@28380000:r5fss@41000000 to driver k3_r5_rproc
    [   13.451008] bus: 'platform': __driver_probe_device: matched device 4d80800000.dsp with driver k3-dsp-rproc
    [   13.451102] bus: 'platform': __driver_probe_device: matched device 4d81800000.dsp with driver k3-dsp-rproc
    [   13.451178] bus: 'platform': __driver_probe_device: matched device 64800000.dsp with driver k3-dsp-rproc
    [   13.478321] bus: 'platform': really_probe: bound device 31f82000.mailbox to driver omap-mailbox
    [   13.483437] bus: 'platform': __driver_probe_device: matched device 4d80800000.dsp with driver k3-dsp-rproc
    [   13.483544] bus: 'platform': __driver_probe_device: matched device 4d81800000.dsp with driver k3-dsp-rproc
    [   13.483619] bus: 'platform': __driver_probe_device: matched device 64800000.dsp with driver k3-dsp-rproc
    [   13.483826] bus: 'platform': __driver_probe_device: matched device rproc-virtio.14.auto with driver rproc-virtio
    [   13.483835] bus: 'platform': really_probe: probing driver rproc-virtio with device rproc-virtio.14.auto
    [   13.484038] bus: 'platform': __driver_probe_device: matched device 4d80800000.dsp with driver k3-dsp-rproc
    [   13.484119] bus: 'platform': __driver_probe_device: matched device 4d81800000.dsp with driver k3-dsp-rproc
    [   13.484190] bus: 'platform': __driver_probe_device: matched device 64800000.dsp with driver k3-dsp-rproc
    [   13.485300] bus: 'platform': really_probe: bound device rproc-virtio.14.auto to driver rproc-virtio
    [   13.507357] bus: 'platform': __driver_probe_device: matched device 31f83000.mailbox with driver omap-mailbox
    [   13.507377] bus: 'platform': really_probe: probing driver omap-mailbox with device 31f83000.mailbox
    [   13.515405] bus: 'platform': really_probe: bound device 31f83000.mailbox to driver omap-mailbox
    [   13.515415] bus: 'platform': __driver_probe_device: matched device 31f84000.mailbox with driver omap-mailbox
    [   13.515421] bus: 'platform': really_probe: probing driver omap-mailbox with device 31f84000.mailbox
    [   13.515617] bus: 'platform': __driver_probe_device: matched device 4d80800000.dsp with driver k3-dsp-rproc
    [   13.515629] bus: 'platform': really_probe: probing driver k3-dsp-rproc with device 4d80800000.dsp
    [   13.517113] bus: 'virtio': __driver_probe_device: matched device virtio1 with driver virtio_rpmsg_bus
    [   13.517124] bus: 'virtio': really_probe: probing driver virtio_rpmsg_bus with device virtio1
    [   13.517532] bus: 'rpmsg': __driver_probe_device: matched device virtio1.rpmsg_ns.53.53 with driver rpmsg_ns
    [   13.517536] bus: 'rpmsg': really_probe: probing driver rpmsg_ns with device virtio1.rpmsg_ns.53.53
    [   13.517587] bus: 'rpmsg': really_probe: bound device virtio1.rpmsg_ns.53.53 to driver rpmsg_ns
    [   13.624788] bus: 'virtio': really_probe: bound device virtio1 to driver virtio_rpmsg_bus
    [   13.648409] bus: 'platform': really_probe: bound device 31f84000.mailbox to driver omap-mailbox
    [   13.648701] Extended deferred probe timeout by 10 secs
    [   13.850305] Workqueue: events_unbound deferred_probe_work_func
    [   13.973004]  k3_dsp_rproc_probe+0x7ac/0x934 [ti_k3_dsp_remoteproc]
    [   13.979175]  platform_probe+0x68/0xc4
    [   13.982824]  really_probe+0x17c/0x380
    [   13.986475]  __driver_probe_device+0xa8/0x158
    [   13.990818]  driver_probe_device+0x3c/0x110
    [   14.007062]  device_initial_probe+0x14/0x20
    [   14.011232]  bus_probe_device+0xac/0xb0
    [   14.015054]  deferred_probe_work_func+0xa8/0xe4
    [   14.166889]  k3_r5_probe+0x878/0xdcc [ti_k3_r5_remoteproc]
    [   14.166908]  platform_probe+0x68/0xc4
    [   14.166913]  really_probe+0x17c/0x380
    [   14.166919]  __driver_probe_device+0xa8/0x158
    [   14.166923]  driver_probe_device+0x3c/0x110
    [   14.222711] bus: 'platform': __driver_probe_device: matched device 6000000.usb with driver cdns-usb3
    [   14.222729] bus: 'platform': really_probe: probing driver cdns-usb3 with device 6000000.usb
    [   14.254628] bus: 'platform': __driver_probe_device: matched device 4e84000.ufs with driver cdns-ufshcd
    [   14.254646] bus: 'platform': really_probe: probing driver cdns-ufshcd with device 4e84000.ufs
    [   14.484328] bus: 'platform': __driver_probe_device: matched device b020000.interrupt-controller with driver pruss-intc
    [   14.523938] bus: 'platform': __driver_probe_device: matched device b034000.pru with driver pru-rproc
    [   14.527287] bus: 'platform': really_probe: probing driver pruss-intc with device b020000.interrupt-controller
    [   14.539283] bus: 'platform': really_probe: probing driver pru-rproc with device b034000.pru
    [   14.570658] bus: 'platform': really_probe: bound device b020000.interrupt-controller to driver pruss-intc
    [   14.578154] bus: 'platform': __driver_probe_device: matched device TI-am335x-adc.11.auto with driver TI-am335x-adc
    [   14.581533] bus: 'platform': __driver_probe_device: matched device b120000.interrupt-controller with driver pruss-intc
    [   14.687828] bus: 'platform': really_probe: probing driver TI-am335x-adc with device TI-am335x-adc.11.auto
    [   14.728914] bus: 'platform': really_probe: bound device 6000000.usb to driver cdns-usb3
    [   14.733756] bus: 'platform': really_probe: probing driver pruss-intc with device b120000.interrupt-controller
    [   14.741619] bus: 'platform': __driver_probe_device: matched device 6400000.usb with driver cdns-usb3
    [   14.768096] bus: 'platform': really_probe: bound device b120000.interrupt-controller to driver pruss-intc
    [   14.778103] bus: 'platform': really_probe: bound device b034000.pru to driver pru-rproc
    [   14.787678] Extended deferred probe timeout by 10 secs
    [   14.795064] bus: 'platform': really_probe: probing driver cdns-usb3 with device 6400000.usb
    [   14.802580] bus: 'platform': really_probe: bound device 4e84000.ufs to driver cdns-ufshcd
    [   14.806243] bus: 'platform': __driver_probe_device: matched device b004000.rtu with driver pru-rproc
    [   14.816292] Extended deferred probe timeout by 10 secs
    [   14.825246] bus: 'platform': really_probe: probing driver pru-rproc with device b004000.rtu
    [   14.894640] bus: 'platform': __driver_probe_device: matched device xhci-hcd.15.auto with driver xhci-hcd
    [   14.903561] bus: 'platform': really_probe: bound device TI-am335x-adc.11.auto to driver TI-am335x-adc
    [   14.920552] bus: 'platform': __driver_probe_device: matched device TI-am335x-adc.12.auto with driver TI-am335x-adc
    [   14.938042] bus: 'platform': really_probe: probing driver TI-am335x-adc with device TI-am335x-adc.12.auto
    [   14.948690] bus: 'scsi': __driver_probe_device: matched device 0:0:0:49488 with driver ufs_device_wlun
    [   14.955645] bus: 'platform': really_probe: probing driver xhci-hcd with device xhci-hcd.15.auto
    [   14.981487] bus: 'scsi': really_probe: probing driver ufs_device_wlun with device 0:0:0:49488
    [   14.994628] bus: 'platform': really_probe: bound device b004000.rtu to driver pru-rproc
    [   15.026061] bus: 'scsi': really_probe: bound device 0:0:0:49488 to driver ufs_device_wlun
    [   15.035075] bus: 'platform': __driver_probe_device: matched device b00a000.txpru with driver pru-rproc
    [   15.061513] bus: 'platform': really_probe: probing driver pru-rproc with device b00a000.txpru
    [   15.069576] bus: 'scsi': __driver_probe_device: matched device 0:0:0:49476 with driver ufs_device_wlun
    [   15.093092] bus: 'platform': really_probe: bound device b00a000.txpru to driver pru-rproc
    [   15.093105] bus: 'platform': __driver_probe_device: matched device b038000.pru with driver pru-rproc
    [   15.093110] bus: 'platform': really_probe: probing driver pru-rproc with device b038000.pru
    [   15.093398] bus: 'platform': really_probe: bound device b038000.pru to driver pru-rproc
    [   15.093405] bus: 'platform': __driver_probe_device: matched device b006000.rtu with driver pru-rproc
    [   15.093409] bus: 'platform': really_probe: probing driver pru-rproc with device b006000.rtu
    [   15.093581] bus: 'platform': really_probe: bound device b006000.rtu to driver pru-rproc
    [   15.093588] bus: 'platform': __driver_probe_device: matched device b00c000.txpru with driver pru-rproc
    [   15.093591] bus: 'platform': really_probe: probing driver pru-rproc with device b00c000.txpru
    [   15.093818] bus: 'platform': really_probe: bound device b00c000.txpru to driver pru-rproc
    [   15.093844] bus: 'platform': __driver_probe_device: matched device b134000.pru with driver pru-rproc
    [   15.093848] bus: 'platform': really_probe: probing driver pru-rproc with device b134000.pru
    [   15.094097] bus: 'platform': really_probe: bound device b134000.pru to driver pru-rproc
    [   15.094104] bus: 'platform': __driver_probe_device: matched device b104000.rtu with driver pru-rproc
    [   15.094108] bus: 'platform': really_probe: probing driver pru-rproc with device b104000.rtu
    [   15.094282] bus: 'platform': really_probe: bound device b104000.rtu to driver pru-rproc
    [   15.094288] bus: 'platform': __driver_probe_device: matched device b10a000.txpru with driver pru-rproc
    [   15.094291] bus: 'platform': really_probe: probing driver pru-rproc with device b10a000.txpru
    [   15.094437] bus: 'platform': really_probe: bound device b10a000.txpru to driver pru-rproc
    [   15.094444] bus: 'platform': __driver_probe_device: matched device b138000.pru with driver pru-rproc
    [   15.094447] bus: 'platform': really_probe: probing driver pru-rproc with device b138000.pru
    [   15.094608] bus: 'platform': really_probe: bound device b138000.pru to driver pru-rproc
    [   15.094616] bus: 'platform': __driver_probe_device: matched device b106000.rtu with driver pru-rproc
    [   15.094620] bus: 'platform': really_probe: probing driver pru-rproc with device b106000.rtu
    [   15.094780] bus: 'platform': really_probe: bound device b106000.rtu to driver pru-rproc
    [   15.094786] bus: 'platform': __driver_probe_device: matched device b10c000.txpru with driver pru-rproc
    [   15.094789] bus: 'platform': really_probe: probing driver pru-rproc with device b10c000.txpru
    [   15.094931] bus: 'platform': really_probe: bound device b10c000.txpru to driver pru-rproc
    [   15.094972] Extended deferred probe timeout by 10 secs
    [   15.095051] bus: 'platform': really_probe: bound device TI-am335x-adc.12.auto to driver TI-am335x-adc
    [   15.102519] bus: 'scsi': really_probe: probing driver ufs_device_wlun with device 0:0:0:49476
    [   15.110779] Extended deferred probe timeout by 10 secs
    [   15.143285] ufs_device_wlun: probe of 0:0:0:49476 rejects match -19
    [   15.499575] scsi 0:0:0:49476: scheduling asynchronous probe
    [   15.505207] bus: 'scsi': __driver_probe_device: matched device 0:0:0:49476 with driver sd
    [   15.513600] bus: 'scsi': really_probe: probing driver sd with device 0:0:0:49476
    [   15.529096] sd: probe of 0:0:0:49476 rejects match -19
    [   15.529120] scsi 0:0:0:49476: async probe completed
    [   15.889631] bus: 'rpmsg': __driver_probe_device: matched device virtio0.rpmsg_chrdev.-1.14 with driver rpmsg_chrdev
    [   15.915766] bus: 'rpmsg': really_probe: probing driver rpmsg_chrdev with device virtio0.rpmsg_chrdev.-1.14
    [   15.943701] bus: 'rpmsg': really_probe: bound device virtio0.rpmsg_chrdev.-1.14 to driver rpmsg_chrdev
    [   15.953465] bus: 'rpmsg': __driver_probe_device: matched device virtio1.rpmsg_chrdev.-1.13 with driver rpmsg_chrdev
    [   15.969638] bus: 'rpmsg': really_probe: probing driver rpmsg_chrdev with device virtio1.rpmsg_chrdev.-1.13
    [   16.000184] bus: 'rpmsg': really_probe: bound device virtio1.rpmsg_chrdev.-1.13 to driver rpmsg_chrdev
    [   16.053081] Extended deferred probe timeout by 10 secs
    [   16.131408] bus: 'rpmsg': __driver_probe_device: matched device virtio0.rpmsg_ctrl.0.0 with driver rpmsg_ctrl
    [   16.141515] bus: 'rpmsg': really_probe: probing driver rpmsg_ctrl with device virtio0.rpmsg_ctrl.0.0
    [   16.159642] bus: 'rpmsg': really_probe: bound device virtio0.rpmsg_ctrl.0.0 to driver rpmsg_ctrl
    [   16.169181] bus: 'rpmsg[   30.684756] xhci-hcd xhci-hcd.15.auto: can't setup: -110
    ': __driver_probe_device: matched device virtio1.rpmsg_ctrl.0.0 [   30.692711] xhci-hcd xhci-hcd.15.auto: USB bus 1 deregistered
    with driver rpmsg_ctrl
    [   16.179153] bus: 'rpmsg': really_prob[   30.704003] xhci-hcd: probe of xhci-hcd.15.auto failed with error -110
    [   30.716227] driver: 'cdns-usb3': driver_bound: bound to device '6400000.usb'
    
    [   16.197291] bus: 'rpmsg': really_probe: bound device virtio1[   30.728666] bus: 'platform': really_probe: bound device 6400000.usb to driver cdns-usb3
    .rpmsg_ctrl.0.0 to driver rpmsg_ctrl
    [   16.206566] Extended deferred probe timeout by 10 secs
    root@j721e-evm:~#
    

    We want to see things like the following in your log:

    • [ 12.440893] bus: 'platform': really_probe: probing driver tidss with device 4a00000.dss
      [ 12.459015] tidss 4a00000.dss: Driver tidss requests probe deferral
    • [   12.459015] tidss 4a00000.dss: Driver tidss requests probe deferral

    ^ the above is proof that the device driver is being probed, but the initialization of the driver is delayed because there are other dependencies in the display driver that is not initialized.

    Eventually, if dependencies are initialized, then it should have a log similar to:

    • [   12.799538] bus: 'platform': really_probe: bound device 4a00000.dss to driver tidss

    In your particular case we want to see these logs for DSS, DSI, DSI bridge, and panel. The hope is to see if they are probed, and if they are probed, why they are failing to initialize completely to enumerate the display panel.

    Regards,

    Takuma

  • Hi Takuma

    I didn't see the relevant log of the tidss module. Is this module enabled by default? Or does it require device tree configuration?

    After I modified the code today, there was some improvement. Here is the content related to 941 from the global search:
    root@j721e-evm:~# find / -name *941*
    /run/udev/data/+platform:gpio-regulator-tps659411
    /dev/display941
    /sys/kernel/debug/regmap/1-0016-ds90ub941
    /sys/class/devlink/platform:fixedregulator-vsys3v3--platform:gpio-regulator-tps659411
    /sys/class/devlink/platform:11c000.pinctrl--platform:gpio-regulator-tps659411
    /sys/class/devlink/platform:600000.gpio--platform:gpio-regulator-tps659411
    /sys/class/display941
    /sys/class/display941/display941
    /sys/devices/platform/gpio-regulator-tps659411
    /sys/devices/platform/bus@100000/600000.gpio/consumer:platform:gpio-regulator-tps659411
    /sys/devices/platform/bus@100000/11c000.pinctrl/consumer:platform:gpio-regulator-tps659411
    /sys/devices/platform/fixedregulator-vsys3v3/consumer:platform:gpio-regulator-tps659411
    /sys/devices/virtual/devlink/platform:fixedregulator-vsys3v3--platform:gpio-regulator-tps659411
    /sys/devices/virtual/devlink/platform:11c000.pinctrl--platform:gpio-regulator-tps659411
    /sys/devices/virtual/devlink/platform:600000.gpio--platform:gpio-regulator-tps659411
    /sys/devices/virtual/display941
    /sys/devices/virtual/display941/display941
    /sys/bus/platform/devices/gpio-regulator-tps659411
    /sys/bus/platform/drivers/gpio-regulator/gpio-regulator-tps659411
    /sys/bus/mipi-dsi/drivers/bridgeds90ub941
    /sys/bus/i2c/drivers/ds90ub941
    /sys/firmware/devicetree/base/gpio-regulator-tps659411
    /sys/firmware/devicetree/base/bus@100000/i2c@2010000/dsi941bridge@0x16
    /sys/firmware/devicetree/base/symbols/dsi941bridge


    I found that there is content related to my bridge in /sys/bus/mipi-dsi/drivers/bridgeds90ub941, but there is still no clock output for DSI.

    Could you help me analyze this?

    Regards,

    FuGuojia

  • Hi FuGuojia,

    I didn't see the relevant log of the tidss module. Is this module enabled by default? Or does it require device tree configuration?

    The patch I shared previously should enable these logs. No change to device tree. 

    Could you add this patch to enable more logs during probe for all of the drivers, and then share the logs?

    4456.0001-Enable-debug-logs-for-device-driver-probing.patch

    The dd.c is a driver that is used by the entire Linux system. By enabling the debug logs in dd.c, it should print out the extra logs from tidss, your dsi941bridge, and all other device drivers.

    Could you help me analyze this?

    Enabling the debug logs within dd.c would be the best way to analyze what is happening. Because, this lets you see all the logs from the probe functions that exist for all device drivers.

    For troubleshooting, could you share the full log output from "zcat /proc/config.gz > config_file_fuguojia.txt"? I will share mine, and we can do a diff to see if there are differences in the config file causing the patch to not show the extra debug logs.

    config_file_takuma.txt

    Regards,

    Takuma

  • Hi Takuma

    Enabling the debug logs within dd.c would be the best way to analyze what is happening. Because, this lets you see all the logs from the probe functions that exist for all device drivers.

    For troubleshooting, could you share the full log output from "zcat /proc/config.gz > config_file_fuguojia.txt"? I will share mine, and we can do a diff to see if there are differences in the config file causing the patch to not show the extra debug logs.

    As requested, I have generated the files. 

    config_file_fuguojia.txt

    During today's debugging, I encountered an issue where calling the ti_bridge_ds90ub941_parse_dt function in probe returns -517. The specific logs are as follows:

    root@j721e-evm:~# dmesg | grep dss
    [    9.899316] bus: 'platform': __driver_probe_device: matched device 4a00000.dss with driver tidss
    [    9.899339] bus: 'platform': really_probe: probing driver tidss with device 4a00000.dss
    [    9.967061] tidss 4a00000.dss: Driver tidss requests probe deferral
    [    9.972660] platform 4a00000.dss: Added to deferred list
    [   10.193676] platform 4a00000.dss: Retrying from deferred list
    root@j721e-evm:~# dmesg | grep ub941
    [    9.718624] bus: 'mipi-dsi': __driver_probe_device: matched device 4800000.dsi.0 with driver bridgeds90ub941
    [    9.718632] bus: 'mipi-dsi': really_probe: probing driver bridgeds90ub941 with device 4800000.dsi.0
    [    9.718643] ti_bridge_ds90ub941_probe start
    [    9.787943] ti_bridge_ds90ub941_parse_dt ret = -517
    [   23.559580] mipi-dsi 4800000.dsi.0: deferred probe pending
    [   23.565093] platform 2900000.pcie: deferred probe pending
    [   23.570485] platform 2910000.pcie: deferred probe pending
    [   23.575875] platform 2920000.pcie: deferred probe pending

    Here is the all log file:
    displaylog0515.txt

    Below are my DTS file and probe code. I suspect there might be an issue with the device tree. 
    // SPDX-License-Identifier: GPL-2.0
    /*
     * Copyright (c) 2018, The Linux Foundation. All rights reserved.
     * datasheet: https://www.ti.com/lit/ds/symlink/ds90ub941.pdf
     */
    
     #include <linux/atomic.h>
     #include <linux/auxiliary_bus.h>
     #include <linux/bitfield.h>
     #include <linux/bits.h>
     #include <linux/clk.h>
     #include <linux/debugfs.h>
     #include <linux/gpio/consumer.h>
     #include <linux/gpio/driver.h>
     #include <linux/i2c.h>
     #include <linux/iopoll.h>
     #include <linux/module.h>
     #include <linux/of_graph.h>
     #include <linux/pm_runtime.h>
     #include <linux/pwm.h>
     #include <linux/regmap.h>
     #include <linux/regulator/consumer.h>
     #include <linux/init.h>
     #include <linux/fs.h>
     #include <linux/uaccess.h>
     #include <linux/ioctl.h>
     #include <linux/major.h>
     #include <linux/platform_device.h>
    
     #include <asm/unaligned.h>
     
     #include <drm/display/drm_dp_aux_bus.h>
     #include <drm/display/drm_dp_helper.h>
     #include <drm/drm_atomic.h>
     #include <drm/drm_atomic_helper.h>
     #include <drm/drm_bridge.h>
     #include <drm/drm_bridge_connector.h>
     #include <drm/drm_edid.h>
     #include <drm/drm_mipi_dsi.h>
     #include <drm/drm_of.h>
     #include <drm/drm_panel.h>
     #include <drm/drm_print.h>
     #include <drm/drm_probe_helper.h>
     
    /* PPI layer registers */
    #define PPI_STARTPPI		0x0104 /* START control bit */
    #define PPI_LPTXTIMECNT		0x0114 /* LPTX timing signal */
    #define PPI_D0S_ATMR		0x0144
    #define PPI_D1S_ATMR		0x0148
    #define PPI_D0S_CLRSIPOCOUNT	0x0164 /* Assertion timer for Lane 0 */
    #define PPI_D1S_CLRSIPOCOUNT	0x0168 /* Assertion timer for Lane 1 */
    #define PPI_START_FUNCTION	1
    
    /* DSI layer registers */
    #define DSI_STARTDSI		0x0204 /* START control bit of DSI-TX */
    #define DSI_LANEENABLE		0x0210 /* Enables each lane */
    #define DSI_RX_START		1
    
    /* LCDC/DPI Host Registers, based on guesswork that this matches TC358764 */
    #define LCDCTRL			0x0420 /* Video Path Control */
    #define LCDCTRL_MSF		BIT(0) /* Magic square in RGB666 */
    #define LCDCTRL_VTGEN		BIT(4)/* Use chip clock for timing */
    #define LCDCTRL_UNK6		BIT(6) /* Unknown */
    #define LCDCTRL_EVTMODE		BIT(5) /* Event mode */
    #define LCDCTRL_RGB888		BIT(8) /* RGB888 mode */
    #define LCDCTRL_HSPOL		BIT(17) /* Polarity of HSYNC signal */
    #define LCDCTRL_DEPOL		BIT(18) /* Polarity of DE signal */
    #define LCDCTRL_VSPOL		BIT(19) /* Polarity of VSYNC signal */
    #define LCDCTRL_VSDELAY(v)	(((v) & 0xfff) << 20) /* VSYNC delay */
    
    /* SPI Master Registers */
    #define SPICMR			0x0450
    #define SPITCR			0x0454
    
    /* System Controller Registers */
    #define SYSCTRL			0x0464
    
    /* System registers */
    #define LPX_PERIOD		3
    
    /* Lane enable PPI and DSI register bits */
    #define LANEENABLE_CLEN		BIT(0)
    #define LANEENABLE_L0EN		BIT(1)
    #define LANEENABLE_L1EN		BIT(2)
     
     struct ti_bridge_ds90ub941 {
    	struct device *dev;
    	struct drm_bridge bridge;
    	struct regulator *regulator;
    	struct drm_bridge *panel_bridge;
    	struct drm_display_mode mode;
    	bool pre_enabled;
    	int error;
    };
    
    static int ti_bridge_ds90ub941_clear_error(struct ti_bridge_ds90ub941 *ctx)
    {
    	int ret = ctx->error;
    
    	ctx->error = 0;
    	return ret;
    }
    
    static void ti_bridge_ds90ub941_write(struct ti_bridge_ds90ub941 *ctx, u16 addr, u32 val)
    {
    	struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
    	ssize_t ret;
    	u8 data[6];
    
    	if (ctx->error)
    		return;
    
    	data[0] = addr;
    	data[1] = addr >> 8;
    	data[2] = val;
    	data[3] = val >> 8;
    	data[4] = val >> 16;
    	data[5] = val >> 24;
    
    	ret = mipi_dsi_generic_write(dsi, data, sizeof(data));
    	if (ret < 0)
    		ctx->error = ret;
    }
    
    static inline struct ti_bridge_ds90ub941 *bridge_to_ti_bridge_ds90ub941(struct drm_bridge *bridge)
    {
    	return container_of(bridge, struct ti_bridge_ds90ub941, bridge);
    }
    
    static int ti_bridge_ds90ub941_init(struct ti_bridge_ds90ub941 *ctx)
    {
    	u32 lcdctrl;
    
    	ti_bridge_ds90ub941_write(ctx, DSI_LANEENABLE,
    		       LANEENABLE_L0EN | LANEENABLE_CLEN);
    	ti_bridge_ds90ub941_write(ctx, PPI_D0S_CLRSIPOCOUNT, 5);
    	ti_bridge_ds90ub941_write(ctx, PPI_D1S_CLRSIPOCOUNT, 5);
    	ti_bridge_ds90ub941_write(ctx, PPI_D0S_ATMR, 0);
    	ti_bridge_ds90ub941_write(ctx, PPI_D1S_ATMR, 0);
    	ti_bridge_ds90ub941_write(ctx, PPI_LPTXTIMECNT, LPX_PERIOD);
    
    	ti_bridge_ds90ub941_write(ctx, SPICMR, 0x00);
    
    	lcdctrl = LCDCTRL_VSDELAY(1) | LCDCTRL_RGB888 |
    		  LCDCTRL_UNK6 | LCDCTRL_VTGEN;
    
    	if (ctx->mode.flags & DRM_MODE_FLAG_NHSYNC)
    		lcdctrl |= LCDCTRL_HSPOL;
    
    	if (ctx->mode.flags & DRM_MODE_FLAG_NVSYNC)
    		lcdctrl |= LCDCTRL_VSPOL;
    
    	ti_bridge_ds90ub941_write(ctx, LCDCTRL, lcdctrl);
    
    	ti_bridge_ds90ub941_write(ctx, SYSCTRL, 0x040f);
    	msleep(100);
    
    	ti_bridge_ds90ub941_write(ctx, PPI_STARTPPI, PPI_START_FUNCTION);
    	ti_bridge_ds90ub941_write(ctx, DSI_STARTDSI, DSI_RX_START);
    
    	msleep(100);
    
    	return ti_bridge_ds90ub941_clear_error(ctx);
    }
    
    static void ti_bridge_ds90ub941_post_disable(struct drm_bridge *bridge, struct drm_bridge_state *state)
    {
    	struct ti_bridge_ds90ub941 *ctx = bridge_to_ti_bridge_ds90ub941(bridge);
    	int ret;
    
    	/*
    	 * The post_disable hook might be called multiple times.
    	 * We want to avoid regulator imbalance below.
    	 */
    	if (!ctx->pre_enabled)
    		return;
    
    	ctx->pre_enabled = false;
    
    	ret = regulator_disable(ctx->regulator);
    	if (ret < 0)
    		dev_err(ctx->dev, "error disabling regulators (%d)\n", ret);
    }
    
    static void ti_bridge_ds90ub941_pre_enable(struct drm_bridge *bridge, struct drm_bridge_state *state)
    {
    	struct ti_bridge_ds90ub941 *ctx = bridge_to_ti_bridge_ds90ub941(bridge);
    	int ret;
    
    	ret = regulator_enable(ctx->regulator);
    	if (ret < 0)
    		dev_err(ctx->dev, "error enabling regulators (%d)\n", ret);
    
    	ctx->pre_enabled = true;
    }
    
    static void ti_bridge_ds90ub941_enable(struct drm_bridge *bridge, struct drm_bridge_state *state)
    {
    	struct ti_bridge_ds90ub941 *ctx = bridge_to_ti_bridge_ds90ub941(bridge);
    	int ret;
    
    	ret = ti_bridge_ds90ub941_init(ctx);
    	if (ret < 0)
    		dev_err(ctx->dev, "error initializing bridge (%d)\n", ret);
    }
    
    static int ti_bridge_ds90ub941_attach(struct drm_bridge *bridge,
    			   enum drm_bridge_attach_flags flags)
    {
    	struct ti_bridge_ds90ub941 *ctx = bridge_to_ti_bridge_ds90ub941(bridge);
    
    	return drm_bridge_attach(bridge->encoder, ctx->panel_bridge,
    				 bridge, flags);
    }
    static const struct drm_display_mode default_mode = {
    	.clock = 71000,
    	.hdisplay = 800,
    	.hsync_start = 800 + 32,
    	.hsync_end = 800 + 32 + 1,
    	.htotal = 800 + 32 + 1 + 57,
    	.vdisplay = 1280,
    	.vsync_start = 1280 + 28,
    	.vsync_end = 1280 + 28 + 1,
    	.vtotal = 1280 + 28 + 1 + 14,
    };
    
    static void ti_bridge_ds90ub941_bridge_mode_set(struct drm_bridge *bridge,
    				     const struct drm_display_mode *mode,
    				     const struct drm_display_mode *adj)
    {
    	struct ti_bridge_ds90ub941 *ctx = bridge_to_ti_bridge_ds90ub941(bridge);
    
    	drm_mode_copy(&ctx->mode, mode);
    }
    
    static const struct drm_bridge_funcs ti_bridge_ds90ub941_bridge_funcs = {
    	.atomic_post_disable = ti_bridge_ds90ub941_post_disable,
    	.atomic_pre_enable = ti_bridge_ds90ub941_pre_enable,
    	.atomic_enable = ti_bridge_ds90ub941_enable,
    	.atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
    	.atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
    	.atomic_reset = drm_atomic_helper_bridge_reset,
    	.attach = ti_bridge_ds90ub941_attach,
    	.mode_set = ti_bridge_ds90ub941_bridge_mode_set,
    };
    
    static int ti_bridge_ds90ub941_parse_dt(struct ti_bridge_ds90ub941 *ctx)
    {
    	struct drm_bridge *panel_bridge;
    	struct device *dev = ctx->dev;
    
    	panel_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 1, 0);
    	if (IS_ERR(panel_bridge))
    		return PTR_ERR(panel_bridge);
    
    	ctx->panel_bridge = panel_bridge;
    
    	return 0;
    }
    
    static int ti_bridge_ds90ub941_configure_regulators(struct ti_bridge_ds90ub941 *ctx)
    {
    	ctx->regulator = devm_regulator_get(ctx->dev, "vddc");
    	if (IS_ERR(ctx->regulator))
    		return PTR_ERR(ctx->regulator);
    
    	return 0;
    }
    
     static int ti_bridge_ds90ub941_probe(struct mipi_dsi_device *dsi)
     {
         struct device *dev = &dsi->dev;
         struct ti_bridge_ds90ub941 *ctx;
         int ret;
     
         printk("ti_bridge_ds90ub941_probe start\n");
         ctx = devm_kzalloc(dev, sizeof(struct ti_bridge_ds90ub941), GFP_KERNEL);
         if (!ctx){
    	 	 printk("devm_kzalloc failed\n");
             return -ENOMEM;
    	 }
    	 printk("devm_kzalloc success\n");
         mipi_dsi_set_drvdata(dsi, ctx);
    	 printk("mipi_dsi_set_drvdata \n");
         ctx->dev = dev;
         ctx->pre_enabled = false;
     
         /* TODO: Find out how to get dual-lane mode working */
         dsi->lanes = 4;
         dsi->format = MIPI_DSI_FMT_RGB888;
         dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
                   MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_VIDEO_HSE;
     
         ret = ti_bridge_ds90ub941_parse_dt(ctx);
    	 printk("ti_bridge_ds90ub941_parse_dt ret = %d\n",ret);
         if (ret < 0)
             return ret;
     
         ret = ti_bridge_ds90ub941_configure_regulators(ctx);
    	 printk("ti_bridge_ds90ub941_configure_regulators ret = %d\n",ret);
         if (ret < 0)
             return ret;
     
         ctx->bridge.funcs = &ti_bridge_ds90ub941_bridge_funcs;
         ctx->bridge.type = DRM_MODE_CONNECTOR_DPI;
         ctx->bridge.of_node = dev->of_node;
         ctx->bridge.pre_enable_prev_first = true;
     
         drm_bridge_add(&ctx->bridge);
    	 printk("drm_bridge_add \n");
         ret = mipi_dsi_attach(dsi);
    	 printk("mipi_dsi_attach ret = %d\n",ret);
         if (ret < 0) {
             drm_bridge_remove(&ctx->bridge);
             dev_err(dev, "failed to attach dsi\n");
         }
    	 ctx->bridge.funcs->mode_set(&ctx->bridge,&default_mode,NULL);
        
         printk("ti_bridge_ds90ub941_probe end\n");
    
         return ret;
     }
     
     static void ti_bridge_ds90ub941_remove(struct mipi_dsi_device *dsi)
     {
         struct ti_bridge_ds90ub941 *ctx = mipi_dsi_get_drvdata(dsi);
     
         mipi_dsi_detach(dsi);
         drm_bridge_remove(&ctx->bridge);
     }
     
     static const struct of_device_id ti_bridge_ds90ub941_of_match[] = {
         { .compatible = "ti,brds90ub941" },
         { }
     };
     MODULE_DEVICE_TABLE(of, ti_bridge_ds90ub941_of_match);
     
     static struct mipi_dsi_driver ti_bridge_ds90ub941_driver = {
         .probe = ti_bridge_ds90ub941_probe,
         .remove = ti_bridge_ds90ub941_remove,
         .driver = {
             .name = "bridgeds90ub941",
             .of_match_table = ti_bridge_ds90ub941_of_match,
         },
     };
    //  module_mipi_dsi_driver(ti_bridge_ds90ub941_driver);
    
    static int __init bridge_ds90ub941_init(void)
    {
    	int err;
    
    	printk("bridge_ds90ub941_init start");
    	err = mipi_dsi_driver_register(&ti_bridge_ds90ub941_driver);
    	if (err < 0)
    		printk("bridge_ds90ub941_init failed");
    
    	return err;
    }
    module_init(bridge_ds90ub941_init);
    
    static void __exit ti_bridge_ds90ub941_exit(void)
    {
    	printk("ti_bridge_ds90ub941_exit start");
        mipi_dsi_driver_unregister(&ti_bridge_ds90ub941_driver);
    }
    
    module_exit(ti_bridge_ds90ub941_exit);
    
     
     MODULE_AUTHOR("Sandeep Panda <spanda@codeaurora.org>");
     MODULE_DESCRIPTION("ds90ub941 DSI to eDP bridge driver");
     MODULE_LICENSE("GPL v2");
     

    // SPDX-License-Identifier: GPL-2.0-or-later OR MIT
    /**
     * DT Overlay for RPi 7inch touchscreen panel interfaced with DSI on
     * J721E based BeagleBone AI-64 (BBAI-64) platform.
     *
     * BBAI-64: https://www.beagleboard.org/boards/beaglebone-ai-64
     * RPi DSI Panel: https://www.raspberrypi.com/products/raspberry-pi-touch-display/
     *
     * Copyright (C) 2024 Texas Instruments Incorporated - https://www.ti.com/
     */
    
    /dts-v1/;
    /plugin/;
    
    #include <dt-bindings/gpio/gpio.h>
    #include <dt-bindings/interrupt-controller/irq.h>
    
    #include "k3-pinctrl.h"
    
    &{/} {
    	bridge_reg: bridge-regulator {
    		compatible = "regulator-fixed";
    		regulator-name = "bridge-reg";
    		gpio = <&display_reg 0 0>;
    		vin-supply = <&display_reg>;
    		enable-active-high;
    	};
    
    	panel0 {
    		compatible = "raspberrypi,7inch-dsi", "simple-panel";
    		backlight = <&display_reg>;
    		power-supply = <&display_reg>;
    		port {
    			panel_in: endpoint {
    				remote-endpoint = <&panel_bridge_out>;
    			};
    		};
    	};
    };
    
    &main_pmx0 {
    	dsi_main_i2c4_pins: dsi-main-i2c4-pins {
    		pinctrl-single,pins = <
    			J721E_IOPAD(0xa8, PIN_INPUT_PULLUP, 2) /* (AD19) PRG1_MDIO0_MDIO.I2C4_SCL */
    			J721E_IOPAD(0xac, PIN_INPUT_PULLUP, 2) /* (AD18) PRG1_MDIO0_MDC.I2C4_SDA */
    		>;
    	};
    };
    
    &main_i2c4 {
    	clock-frequency = <400000>;
    	pinctrl-names = "default";
    	pinctrl-0 = <&dsi_main_i2c4_pins>;
    	#address-cells = <1>;
    	#size-cells = <0>;
    
    	display_reg: regulator@45 {
    		compatible = "raspberrypi,7inch-touchscreen-panel-regulator";
    		reg = <0x45>;
    		gpio-controller;
    		#gpio-cells = <2>;
    	};
    
    	touch-controller@38 {
    		compatible = "edt,edt-ft5406";
    		reg = <0x38>;
    
    		touchscreen-size-x = < 800 >;
    		touchscreen-size-y = < 480 >;
    
    		vcc-supply = <&display_reg>;
    		reset-gpio = <&display_reg 1 1>;
    
    		touchscreen-inverted-x;
    		touchscreen-inverted-y;
    	};
    };
    
    &dss_ports {
    	#address-cells = <1>;
    	#size-cells = <0>;
    
    	port@2 {
    		reg = <2>;
    
    		dpi2_out: endpoint {
    			remote-endpoint = <&dsi0_in>;
    		};
    	};
    };
    
    &dphy2 {
    	status = "okay";
    };
    
    &dsi0 {
    	status = "okay";
    	#address-cells = <1>;
    	#size-cells = <0>;
    
    	ports {
    		#address-cells = <1>;
    		#size-cells = <0>;
    
    		port@0 {
    			reg = <0>;
    			dsi0_out: endpoint {
    				remote-endpoint = <&panel_bridge_in>;
    			};
    		};
    
    		port@1 {
    			reg = <1>;
    			dsi0_in: endpoint {
    				remote-endpoint = <&dpi2_out>;
    			};
    		};
    	};
    
    	bridge@0 {
    		compatible = "toshiba,tc358762";
    		reg = <0>;
    		vddc-supply = <&bridge_reg>;
    		ports {
    			#address-cells = <1>;
    			#size-cells = <0>;
    
    			port@0 {
    				reg = <0>;
    				panel_bridge_in: endpoint {
    					remote-endpoint = <&dsi0_out>;
    				};
    			};
    
    			port@1 {
    				reg = <1>;
    				panel_bridge_out: endpoint {
    					remote-endpoint = <&panel_in>;
    				};
    			};
    		};
    	};
    
    };
    


    Could you help me check if there are errors in my code and device tree?

    Regards,

    FuGuojia

  • Hi FuGuojia,

    Good to see the extra logs from dd.c are displaying. It is as I suspected, which is that a deferred probe is happening. Error code -517 is probe deferred, based off of this header file that defines some of the error codes: https://elixir.bootlin.com/linux/v6.10.2/source/include/linux/errno.h

    In terms of probing order, the panel0 should be the first driver that is probed and bound, and it will sequentially probe the other drivers in display driver until tidss, where tidss will be the last in the display pipeline to be probed.

    Can you grep the dmesg for panel, or simple, or raspberrypi?

    Regards,

    Takuma

  • Hi Takuma

    In terms of probing order, the panel0 should be the first driver that is probed and bound, and it will sequentially probe the other drivers in display driver until tidss, where tidss will be the last in the display pipeline to be probed.

    Can you grep the dmesg for panel, or simple, or raspberrypi?

    The grep result is:

    root@j721e-evm:~#
    root@j721e-evm:~# dmesg | grep panel
    [ 8.721591] platform panel0: Fixed dependency cycle(s) with /bus@100000/dsi@4800000/bridge@0
    [ 8.739792] mipi-dsi 4800000.dsi.0: Fixed dependency cycle(s) with /panel0
    root@j721e-evm:~#
    root@j721e-evm:~#
    root@j721e-evm:~# dmesg | grep simple
    [ 1.966866] bus: 'platform': __driver_probe_device: matched device sound0 with driver asoc-simple-card
    [ 1.966869] bus: 'platform': really_probe: probing driver asoc-simple-card with device sound0
    [ 1.966949] asoc-simple-card sound0: Driver asoc-simple-card requests probe deferral
    [ 2.552624] bus: 'platform': __driver_probe_device: matched device sound0 with driver asoc-simple-card
    [ 2.552629] bus: 'platform': really_probe: probing driver asoc-simple-card with device sound0
    [ 2.552727] asoc-simple-card sound0: Driver asoc-simple-card requests probe deferral
    [ 2.653353] bus: 'platform': __driver_probe_device: matched device sound0 with driver asoc-simple-card
    [ 2.653358] bus: 'platform': really_probe: probing driver asoc-simple-card with device sound0
    [ 2.653448] asoc-simple-card sound0: Driver asoc-simple-card requests probe deferral
    [ 8.144892] bus: 'platform': __driver_probe_device: matched device sound0 with driver asoc-simple-card
    [ 8.144899] bus: 'platform': really_probe: probing driver asoc-simple-card with device sound0
    [ 8.145037] asoc-simple-card sound0: Driver asoc-simple-card requests probe deferral
    [ 8.289120] bus: 'platform': __driver_probe_device: matched device sound0 with driver asoc-simple-card
    [ 8.289127] bus: 'platform': really_probe: probing driver asoc-simple-card with device sound0
    [ 8.289513] asoc-simple-card sound0: Driver asoc-simple-card requests probe deferral
    [ 8.579670] bus: 'platform': __driver_probe_device: matched device sound0 with driver asoc-simple-card
    [ 8.579682] bus: 'platform': really_probe: probing driver asoc-simple-card with device sound0
    [ 8.579792] asoc-simple-card sound0: Driver asoc-simple-card requests probe deferral
    [ 8.778633] bus: 'platform': __driver_probe_device: matched device sound0 with driver asoc-simple-card
    [ 8.778639] bus: 'platform': really_probe: probing driver asoc-simple-card with device sound0
    [ 8.778762] asoc-simple-card sound0: Driver asoc-simple-card requests probe deferral
    [ 8.956800] bus: 'platform': __driver_probe_device: matched device sound0 with driver asoc-simple-card
    [ 8.956807] bus: 'platform': really_probe: probing driver asoc-simple-card with device sound0
    [ 8.956926] asoc-simple-card sound0: Driver asoc-simple-card requests probe deferral
    [ 9.192247] bus: 'platform': __driver_probe_device: matched device sound0 with driver asoc-simple-card
    [ 9.192255] bus: 'platform': really_probe: probing driver asoc-simple-card with device sound0
    [ 9.192457] asoc-simple-card sound0: Driver asoc-simple-card requests probe deferral
    [ 9.354987] bus: 'platform': __driver_probe_device: matched device sound0 with driver asoc-simple-card
    [ 9.354995] bus: 'platform': really_probe: probing driver asoc-simple-card with device sound0
    [ 9.358099] driver: 'asoc-simple-card': driver_bound: bound to device 'sound0'
    [ 9.358173] bus: 'platform': really_probe: bound device sound0 to driver asoc-simple-card
    root@j721e-evm:~# dmesg | grep raspberrypi
    root@j721e-evm:~#

    As discussed in 0513 meeting,you will provide me with a demo to verify that the DSI clock has signal output. May I ask when that can be provided?

    Regards,

    FuGuojia

  • Hi FuGuojia,

    As discussed in 0513 meeting,you will provide me with a demo to verify that the DSI clock has signal output. May I ask when that can be provided?

    I do not have a standalone example for TDA4VM. But, other platforms that use the same DSI block and the same software driver as TDA4VM use DSI.

    For example, TDA4VEN/J722S has a DSI connection to a bridge to eDP:

    You may reference this dts, which is in the same directory as the dts for TDA4VM.

    Regards,

    Takuma

  • Hi Takuma

    1)Are there any differences between the following two referenced solutions?

    For example, TDA4VEN/J722S has a DSI connection to a bridge to eDP:

    You may reference this dts, which is in the same directory as the dts for TDA4VM.

    The "port" property links the display to the bridge:

    		port {
    			panel_in: endpoint {
    				remote-endpoint = <&panel_bridge_out>;
    			};
    		};

    And the toshiba,tc358762 bridge links the display panel and the DSI port:

    			port@0 {
    				reg = <0>;
    				panel_bridge_in: endpoint {
    					remote-endpoint = <&dsi0_out>;
    				};
    			};
    
    			port@1 {
    				reg = <1>;
    				panel_bridge_out: endpoint {
    					remote-endpoint = <&panel_in>;
    				};
    			};

    And then the DSI port creates links between the bridge and the DSS port:

    		port@0 {
    			reg = <0>;
    			dsi0_out: endpoint {
    				remote-endpoint = <&panel_bridge_in>;
    			};
    		};
    
    		port@1 {
    			reg = <1>;
    			dsi0_in: endpoint {
    				remote-endpoint = <&dpi2_out>;
    			};
    		};

    And lastly, the DSS port is connected to DSI port:

    	port@2 {
    		reg = <2>;
    
    		dpi2_out: endpoint {
    			remote-endpoint = <&dsi0_in>;
    		};
    	};

    2)

    Can you grep the dmesg for panel, or simple, or raspberrypi?

    The grep result is:

    root@j721e-evm:~#
    root@j721e-evm:~# dmesg | grep panel
    [ 8.721591] platform panel0: Fixed dependency cycle(s) with /bus@100000/dsi@4800000/bridge@0
    [ 8.739792] mipi-dsi 4800000.dsi.0: Fixed dependency cycle(s) with /panel0
    root@j721e-evm:~#
    root@j721e-evm:~#
    root@j721e-evm:~# dmesg | grep simple
    [ 1.966866] bus: 'platform': __driver_probe_device: matched device sound0 with driver asoc-simple-card
    [ 1.966869] bus: 'platform': really_probe: probing driver asoc-simple-card with device sound0
    [ 1.966949] asoc-simple-card sound0: Driver asoc-simple-card requests probe deferral
    [ 2.552624] bus: 'platform': __driver_probe_device: matched device sound0 with driver asoc-simple-card
    [ 2.552629] bus: 'platform': really_probe: probing driver asoc-simple-card with device sound0
    [ 2.552727] asoc-simple-card sound0: Driver asoc-simple-card requests probe deferral
    [ 2.653353] bus: 'platform': __driver_probe_device: matched device sound0 with driver asoc-simple-card
    [ 2.653358] bus: 'platform': really_probe: probing driver asoc-simple-card with device sound0
    [ 2.653448] asoc-simple-card sound0: Driver asoc-simple-card requests probe deferral
    [ 8.144892] bus: 'platform': __driver_probe_device: matched device sound0 with driver asoc-simple-card
    [ 8.144899] bus: 'platform': really_probe: probing driver asoc-simple-card with device sound0
    [ 8.145037] asoc-simple-card sound0: Driver asoc-simple-card requests probe deferral
    [ 8.289120] bus: 'platform': __driver_probe_device: matched device sound0 with driver asoc-simple-card
    [ 8.289127] bus: 'platform': really_probe: probing driver asoc-simple-card with device sound0
    [ 8.289513] asoc-simple-card sound0: Driver asoc-simple-card requests probe deferral
    [ 8.579670] bus: 'platform': __driver_probe_device: matched device sound0 with driver asoc-simple-card
    [ 8.579682] bus: 'platform': really_probe: probing driver asoc-simple-card with device sound0
    [ 8.579792] asoc-simple-card sound0: Driver asoc-simple-card requests probe deferral
    [ 8.778633] bus: 'platform': __driver_probe_device: matched device sound0 with driver asoc-simple-card
    [ 8.778639] bus: 'platform': really_probe: probing driver asoc-simple-card with device sound0
    [ 8.778762] asoc-simple-card sound0: Driver asoc-simple-card requests probe deferral
    [ 8.956800] bus: 'platform': __driver_probe_device: matched device sound0 with driver asoc-simple-card
    [ 8.956807] bus: 'platform': really_probe: probing driver asoc-simple-card with device sound0
    [ 8.956926] asoc-simple-card sound0: Driver asoc-simple-card requests probe deferral
    [ 9.192247] bus: 'platform': __driver_probe_device: matched device sound0 with driver asoc-simple-card
    [ 9.192255] bus: 'platform': really_probe: probing driver asoc-simple-card with device sound0
    [ 9.192457] asoc-simple-card sound0: Driver asoc-simple-card requests probe deferral
    [ 9.354987] bus: 'platform': __driver_probe_device: matched device sound0 with driver asoc-simple-card
    [ 9.354995] bus: 'platform': really_probe: probing driver asoc-simple-card with device sound0
    [ 9.358099] driver: 'asoc-simple-card': driver_bound: bound to device 'sound0'
    [ 9.358173] bus: 'platform': really_probe: bound device sound0 to driver asoc-simple-card
    root@j721e-evm:~# dmesg | grep raspberrypi
    root@j721e-evm:~#

    Can you tell what's wrong from this log?

    3)Today, I modified the device tree file and encountered the following log. However, I noticed that the program is stuck at:

    [ 8.550520] tidss_probe
    [ 8.559995] [drm] Initialized tidss 1.0.0 20180215 for 4a00000.dss on minor 0
    [ 8.569868] remoteproc remoteproc1: 4d81800000.dsp is available
    [ 8.575435] cdns-mhdp8546 a000000.dp-bridge: Failed to get SAPB memory resource, HDCP not supported
    [ 8.577380] remoteproc remoteproc1: attaching to 4d81800000.dsp
    [ 8.597070] k3-dsp-rproc 4d81800000.dsp: DSP initialized in IPC-only mode

    Do you know what caused this? Below is the full log.

    display_log0520.txt

    Regards,

    FuGuojia

  • Hi FuGuojia,

    Are there any differences between the following two referenced solutions?

    Main difference is the bridge part number, but the concept is the same.

    Can you tell what's wrong from this log?

    There should be a probe for panel0 but that is not showing.

    Today, I modified the device tree file and encountered the following log. However, I noticed that the program is stuck at:

    The newest logs are actually better. drm is starting up with dss initialized and it looks like panel0 is being probed:

    • [ 0.833937] panel-simple panel0: panel_simple_probe 941 START
    • [    9.952945] [drm] Initialized tidss 1.0.0 20180215 for 4a00000.dss on minor 0

    It does not look like the program is stuck, but does "kmsprint" not print any displays?

    Regards,

    Takuma

  • Hi Takuma

    Today, I modified the device tree file and encountered the following log. However, I noticed that the program is stuck at:

    The newest logs are actually better. drm is starting up with dss initialized and it looks like panel0 is being probed:

    • [ 0.833937] panel-simple panel0: panel_simple_probe 941 START
    • [    9.952945] [drm] Initialized tidss 1.0.0 20180215 for 4a00000.dss on minor 0

    It does not look like the program is stuck, but does "kmsprint" not print any displays?

    When I comment out the code in psdkla/board-support/ti-linux-kernel-6.6.32+git-ti/drivers/gpu/drm/drm_client.c ->drm_client_register->ret = client->funcs->hotplug(client), the code can execute normally. What is the function  of this client->funcs->hotplug(client) ?

    Regards,

    FuGuojia

  • Hi FuGuojia,

    I see there is a comment in a different function within drm_client.c that hotplug(client):

    /*
    * Perform an initial hotplug event to pick up the
    * display configuration for the client. This step
    * has to be performed *after* registering the client
    * in the list of clients, or a concurrent hotplug
    * event might be lost; leaving the display off.
    *
    * Hold the clientlist_mutex as for a regular hotplug
    * event.
    */
    And it seems to be related to drm_kms_helper_hotplug event which has the comment of:
    /**
    * drm_kms_helper_hotplug_event - fire off KMS hotplug events
    * @dev: drm_device whose connector state changed
    *
    * This function fires off the uevent for userspace and also calls the
    * output_poll_changed function, which is most commonly used to inform the fbdev
    * emulation code and allow it to update the fbcon output configuration.
    *
    * Drivers should call this from their hotplug handling code when a change is
    * detected. Note that this function does not do any output detection of its
    * own, like drm_helper_hpd_irq_event() does - this is assumed to be done by the
    * driver already.
    *
    * This function must be called from process context with no mode
    * setting locks held.
    *
    * If only a single connector has changed, consider calling
    * drm_kms_helper_connector_hotplug_event() instead.
    */
    It sounds like a feature for things like DP or HDMI where display can be hotplugged during runtime. 
    In any case, when you mention "code can execute normally", does this mean display is functional now? If not, can you share output from "kmsprint"?
    Regards,
    Takuma
  • Hi Takuma

    Thank you very much.

    The display is functional now,

    In any case, when you mention "code can execute normally", does this mean display is functional now? If not, can you share output from "kmsprint"?

    I just want to know if there will be any problem if this part is commented out (I don't have a screen connected right now).

    Regards,

    FuGuojia

  • Hi FuGuojia,

    Awesome to hear the display functional!

    If you do not plan to connect/disconnect the display at runtime, then there should be no issues.

    Regards,

    Takuma

  • Hi FuGuojia,

    However, I would recommend testing with a screen connected as soon as possible. The kmsprint will say what resolution and configuration the software is doing for the display, but this does not necessarily mean it is compatible with the hardware.

    Regards,

    Takuma