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

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
...@@ -32,10 +32,19 @@ Video interfaces: ...@@ -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: ...@@ -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>;
......
...@@ -21,6 +21,7 @@ ...@@ -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 { ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment