|
@@ -15,13 +15,12 @@
|
|
|
#include <drm/drm_crtc.h>
|
|
|
#include <drm/drm_crtc_helper.h>
|
|
|
#include <drm/drm_modes.h>
|
|
|
-#include <drm/drm_panel.h>
|
|
|
+#include <drm/drm_of.h>
|
|
|
|
|
|
#include <linux/component.h>
|
|
|
#include <linux/ioport.h>
|
|
|
#include <linux/of_address.h>
|
|
|
#include <linux/of_device.h>
|
|
|
-#include <linux/of_graph.h>
|
|
|
#include <linux/of_irq.h>
|
|
|
#include <linux/regmap.h>
|
|
|
#include <linux/reset.h>
|
|
@@ -405,74 +404,6 @@ static int sun4i_tcon_init_regmap(struct device *dev,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-struct drm_panel *sun4i_tcon_find_panel(struct device_node *node)
|
|
|
-{
|
|
|
- struct device_node *port, *remote, *child;
|
|
|
- struct device_node *end_node = NULL;
|
|
|
-
|
|
|
- /* Inputs are listed first, then outputs */
|
|
|
- port = of_graph_get_port_by_id(node, 1);
|
|
|
-
|
|
|
- /*
|
|
|
- * Our first output is the RGB interface where the panel will
|
|
|
- * be connected.
|
|
|
- */
|
|
|
- for_each_child_of_node(port, child) {
|
|
|
- u32 reg;
|
|
|
-
|
|
|
- of_property_read_u32(child, "reg", ®);
|
|
|
- if (reg == 0)
|
|
|
- end_node = child;
|
|
|
- }
|
|
|
-
|
|
|
- if (!end_node) {
|
|
|
- DRM_DEBUG_DRIVER("Missing panel endpoint\n");
|
|
|
- return ERR_PTR(-ENODEV);
|
|
|
- }
|
|
|
-
|
|
|
- remote = of_graph_get_remote_port_parent(end_node);
|
|
|
- if (!remote) {
|
|
|
- DRM_DEBUG_DRIVER("Unable to parse remote node\n");
|
|
|
- return ERR_PTR(-EINVAL);
|
|
|
- }
|
|
|
-
|
|
|
- return of_drm_find_panel(remote) ?: ERR_PTR(-EPROBE_DEFER);
|
|
|
-}
|
|
|
-
|
|
|
-struct drm_bridge *sun4i_tcon_find_bridge(struct device_node *node)
|
|
|
-{
|
|
|
- struct device_node *port, *remote, *child;
|
|
|
- struct device_node *end_node = NULL;
|
|
|
-
|
|
|
- /* Inputs are listed first, then outputs */
|
|
|
- port = of_graph_get_port_by_id(node, 1);
|
|
|
-
|
|
|
- /*
|
|
|
- * Our first output is the RGB interface where the panel will
|
|
|
- * be connected.
|
|
|
- */
|
|
|
- for_each_child_of_node(port, child) {
|
|
|
- u32 reg;
|
|
|
-
|
|
|
- of_property_read_u32(child, "reg", ®);
|
|
|
- if (reg == 0)
|
|
|
- end_node = child;
|
|
|
- }
|
|
|
-
|
|
|
- if (!end_node) {
|
|
|
- DRM_DEBUG_DRIVER("Missing bridge endpoint\n");
|
|
|
- return ERR_PTR(-ENODEV);
|
|
|
- }
|
|
|
-
|
|
|
- remote = of_graph_get_remote_port_parent(end_node);
|
|
|
- if (!remote) {
|
|
|
- DRM_DEBUG_DRIVER("Enable to parse remote node\n");
|
|
|
- return ERR_PTR(-EINVAL);
|
|
|
- }
|
|
|
-
|
|
|
- return of_drm_find_bridge(remote) ?: ERR_PTR(-EPROBE_DEFER);
|
|
|
-}
|
|
|
-
|
|
|
static int sun4i_tcon_bind(struct device *dev, struct device *master,
|
|
|
void *data)
|
|
|
{
|
|
@@ -555,22 +486,11 @@ static int sun4i_tcon_probe(struct platform_device *pdev)
|
|
|
struct device_node *node = pdev->dev.of_node;
|
|
|
struct drm_bridge *bridge;
|
|
|
struct drm_panel *panel;
|
|
|
+ int ret;
|
|
|
|
|
|
- /*
|
|
|
- * Neither the bridge or the panel is ready.
|
|
|
- * Defer the probe.
|
|
|
- */
|
|
|
- panel = sun4i_tcon_find_panel(node);
|
|
|
- bridge = sun4i_tcon_find_bridge(node);
|
|
|
-
|
|
|
- /*
|
|
|
- * If we don't have a panel endpoint, just go on
|
|
|
- */
|
|
|
- if ((PTR_ERR(panel) == -EPROBE_DEFER) &&
|
|
|
- (PTR_ERR(bridge) == -EPROBE_DEFER)) {
|
|
|
- DRM_DEBUG_DRIVER("Still waiting for our panel/bridge. Deferring...\n");
|
|
|
- return -EPROBE_DEFER;
|
|
|
- }
|
|
|
+ ret = drm_of_find_panel_or_bridge(node, 1, 0, &panel, &bridge);
|
|
|
+ if (ret == -EPROBE_DEFER)
|
|
|
+ return ret;
|
|
|
|
|
|
return component_add(&pdev->dev, &sun4i_tcon_ops);
|
|
|
}
|