Загрузка данных


static struct mipi_dsi_device *lt9611_attach_dsi(struct lt9611 *lt9611,
						 struct device_node *dsi_node)
{
	const struct mipi_dsi_device_info info = { "lt9611", 0, lt9611->dev->of_node};
	struct mipi_dsi_device *dsi;
	struct mipi_dsi_host *host;
	struct device *dev = lt9611->dev;
	struct device_node *host_node = dsi_node;
	int ret;

	/* 
	 * Если dsi_node указывает на контейнер "ports" или "port", 
	 * поднимаемся выше, пока не найдем узел с зарегистрированным DSI хостом
	 */
	of_node_get(host_node);
	while (host_node) {
		host = of_find_mipi_dsi_host_by_node(host_node);
		if (host)
			break; /* Хост успешно найден! */
		
		/* Если на этом уровне хоста нет, поднимаемся к родителю */
		struct device_node *parent = of_get_parent(host_node);
		of_node_put(host_node);
		host_node = parent;
	}

	if (!host) {
		dev_err(lt9611->dev, "failed to find dsi host for node %pOF\n", dsi_node);
		return ERR_PTR(-EPROBE_DEFER);
	}
	of_node_put(host_node);

	dsi = devm_mipi_dsi_device_register_full(dev, host, &info);
	if (IS_ERR(dsi)) {
		dev_err(lt9611->dev, "failed to create dsi device\n");
		return dsi;
	}

	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_VIDEO_HSE;

	ret = devm_mipi_dsi_attach(dev, dsi);
	if (ret < 0) {
		dev_err(dev, "failed to attach dsi to host\n");
		return ERR_PTR(ret);
	}

	return dsi;
}