Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f5f3b9ba authored by Hyungwon Hwang's avatar Hyungwon Hwang Committed by Inki Dae
Browse files

drm/exynos: dsi: add support for MIC driver as a bridge



MIC must be initilized by MIPI DSI when it is being bound.

Signed-off-by: default avatarHyungwon Hwang <human.hwang@samsung.com>
Signed-off-by: default avatarInki Dae <inki.dae@samsung.com>
parent e6f988a4
Loading
Loading
Loading
Loading
+20 −3
Original line number Original line Diff line number Diff line
@@ -32,10 +32,19 @@ Video interfaces:
  Device node can contain video interface port nodes according to [2].
  Device node can contain video interface port nodes according to [2].
  The following are properties specific to those nodes:
  The following are properties specific to those nodes:


  port node:
  port node inbound:
    - reg: (required) can be 0 for input RGB/I80 port or 1 for DSI port;
    - reg: (required) must be 0.
  port node outbound:
    - reg: (required) must be 1.


  endpoint node of DSI port (reg = 1):
  endpoint node connected from mic node (reg = 0):
    - remote-endpoint: specifies the endpoint in mic node. This node is required
		       for Exynos5433 mipi dsi. So mic can access to panel node
		       thoughout this dsi node.
  endpoint node connected to panel node (reg = 1):
    - remote-endpoint: specifies the endpoint in panel node. This node is
		       required in all kinds of exynos mipi dsi to represent
		       the connection between mipi dsi and panel.
    - samsung,burst-clock-frequency: specifies DSI frequency in high-speed burst
    - samsung,burst-clock-frequency: specifies DSI frequency in high-speed burst
      mode
      mode
    - samsung,esc-clock-frequency: specifies DSI frequency in escape mode
    - samsung,esc-clock-frequency: specifies DSI frequency in escape mode
@@ -74,7 +83,15 @@ Example:
			#address-cells = <1>;
			#address-cells = <1>;
			#size-cells = <0>;
			#size-cells = <0>;


			port@0 {
				reg = <0>;
				decon_to_mic: endpoint {
					remote-endpoint = <&mic_to_decon>;
				};
			};

			port@1 {
			port@1 {
				reg = <1>;
				dsi_ep: endpoint {
				dsi_ep: endpoint {
					reg = <0>;
					reg = <0>;
					samsung,burst-clock-frequency = <500000000>;
					samsung,burst-clock-frequency = <500000000>;
+24 −0
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@
#include <linux/irq.h>
#include <linux/irq.h>
#include <linux/of_device.h>
#include <linux/of_device.h>
#include <linux/of_gpio.h>
#include <linux/of_gpio.h>
#include <linux/of_graph.h>
#include <linux/phy/phy.h>
#include <linux/phy/phy.h>
#include <linux/regulator/consumer.h>
#include <linux/regulator/consumer.h>
#include <linux/component.h>
#include <linux/component.h>
@@ -288,6 +289,7 @@ struct exynos_dsi {
	struct list_head transfer_list;
	struct list_head transfer_list;


	struct exynos_dsi_driver_data *driver_data;
	struct exynos_dsi_driver_data *driver_data;
	struct device_node *bridge_node;
};
};


#define host_to_dsi(host) container_of(host, struct exynos_dsi, dsi_host)
#define host_to_dsi(host) container_of(host, struct exynos_dsi, dsi_host)
@@ -1794,7 +1796,22 @@ static int exynos_dsi_parse_dt(struct exynos_dsi *dsi)


	ret = exynos_dsi_of_read_u32(ep, "samsung,esc-clock-frequency",
	ret = exynos_dsi_of_read_u32(ep, "samsung,esc-clock-frequency",
				     &dsi->esc_clk_rate);
				     &dsi->esc_clk_rate);
	if (ret < 0)
		goto end;

	of_node_put(ep);

	ep = of_graph_get_next_endpoint(node, NULL);
	if (!ep) {
		ret = -ENXIO;
		goto end;
	}


	dsi->bridge_node = of_graph_get_remote_port_parent(ep);
	if (!dsi->bridge_node) {
		ret = -ENXIO;
		goto end;
	}
end:
end:
	of_node_put(ep);
	of_node_put(ep);


@@ -1807,6 +1824,7 @@ static int exynos_dsi_bind(struct device *dev, struct device *master,
	struct exynos_drm_display *display = dev_get_drvdata(dev);
	struct exynos_drm_display *display = dev_get_drvdata(dev);
	struct exynos_dsi *dsi = display_to_dsi(display);
	struct exynos_dsi *dsi = display_to_dsi(display);
	struct drm_device *drm_dev = data;
	struct drm_device *drm_dev = data;
	struct drm_bridge *bridge;
	int ret;
	int ret;


	ret = exynos_drm_create_enc_conn(drm_dev, display);
	ret = exynos_drm_create_enc_conn(drm_dev, display);
@@ -1816,6 +1834,12 @@ static int exynos_dsi_bind(struct device *dev, struct device *master,
		return ret;
		return ret;
	}
	}


	bridge = of_drm_find_bridge(dsi->bridge_node);
	if (bridge) {
		display->encoder->bridge = bridge;
		drm_bridge_attach(drm_dev, bridge);
	}

	return mipi_dsi_host_register(&dsi->dsi_host);
	return mipi_dsi_host_register(&dsi->dsi_host);
}
}