mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
drm/omap: dss: Fix output next device lookup in DT
The DSS core looks up the next device connected to an output by traversing the OF graph. It currently hardcodes the local port number to 0, which breaks any output with a different port number (SDI on OMAP3 and any DPI output but the first one). Fix this by repurposing the currently unused of_ports bitmask in omap_dss_device with an of_port output port number, and use it to traverse the OF graph. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ti.com> Tested-by: Sebastian Reichel <sebastian.reichel@collabora.com> Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> Link: https://patchwork.freedesktop.org/patch/msgid/20200226112514.12455-26-laurent.pinchart@ideasonboard.com
This commit is contained in:
parent
a779618b4a
commit
c83fefd738
@ -55,7 +55,7 @@ static int tvc_probe(struct platform_device *pdev)
|
||||
dssdev->type = OMAP_DISPLAY_TYPE_VENC;
|
||||
dssdev->display = true;
|
||||
dssdev->owner = THIS_MODULE;
|
||||
dssdev->of_ports = BIT(0);
|
||||
dssdev->of_port = 0;
|
||||
|
||||
omapdss_display_init(dssdev);
|
||||
omapdss_device_register(dssdev);
|
||||
|
@ -139,7 +139,7 @@ static int hdmic_probe(struct platform_device *pdev)
|
||||
dssdev->type = OMAP_DISPLAY_TYPE_HDMI;
|
||||
dssdev->display = true;
|
||||
dssdev->owner = THIS_MODULE;
|
||||
dssdev->of_ports = BIT(0);
|
||||
dssdev->of_port = 0;
|
||||
dssdev->ops_flags = ddata->hpd_gpio
|
||||
? OMAP_DSS_DEVICE_OP_DETECT | OMAP_DSS_DEVICE_OP_HPD
|
||||
: 0;
|
||||
|
@ -86,7 +86,7 @@ static int opa362_probe(struct platform_device *pdev)
|
||||
dssdev->dev = &pdev->dev;
|
||||
dssdev->type = OMAP_DISPLAY_TYPE_VENC;
|
||||
dssdev->owner = THIS_MODULE;
|
||||
dssdev->of_ports = BIT(1) | BIT(0);
|
||||
dssdev->of_port = 1;
|
||||
|
||||
dssdev->next = omapdss_of_find_connected_device(pdev->dev.of_node, 1);
|
||||
if (IS_ERR(dssdev->next)) {
|
||||
|
@ -165,7 +165,7 @@ static int tpd_probe(struct platform_device *pdev)
|
||||
dssdev->dev = &pdev->dev;
|
||||
dssdev->type = OMAP_DISPLAY_TYPE_HDMI;
|
||||
dssdev->owner = THIS_MODULE;
|
||||
dssdev->of_ports = BIT(1) | BIT(0);
|
||||
dssdev->of_port = 1;
|
||||
dssdev->ops_flags = OMAP_DSS_DEVICE_OP_DETECT
|
||||
| OMAP_DSS_DEVICE_OP_HPD;
|
||||
|
||||
|
@ -1265,7 +1265,7 @@ static int dsicm_probe(struct platform_device *pdev)
|
||||
dssdev->type = OMAP_DISPLAY_TYPE_DSI;
|
||||
dssdev->display = true;
|
||||
dssdev->owner = THIS_MODULE;
|
||||
dssdev->of_ports = BIT(0);
|
||||
dssdev->of_port = 0;
|
||||
dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
|
||||
|
||||
dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE |
|
||||
|
@ -625,7 +625,7 @@ static int dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
|
||||
out->id = OMAP_DSS_OUTPUT_DPI;
|
||||
out->type = OMAP_DISPLAY_TYPE_DPI;
|
||||
out->dispc_channel = dpi_get_channel(dpi);
|
||||
out->of_ports = BIT(port_num);
|
||||
out->of_port = port_num;
|
||||
out->ops = &dpi_ops;
|
||||
out->owner = THIS_MODULE;
|
||||
|
||||
|
@ -5116,7 +5116,7 @@ static int dsi_init_output(struct dsi_data *dsi)
|
||||
out->dispc_channel = dsi_get_channel(dsi);
|
||||
out->ops = &dsi_ops;
|
||||
out->owner = THIS_MODULE;
|
||||
out->of_ports = BIT(0);
|
||||
out->of_port = 0;
|
||||
out->bus_flags = DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE
|
||||
| DRM_BUS_FLAG_DE_HIGH
|
||||
| DRM_BUS_FLAG_SYNC_DRIVE_NEGEDGE;
|
||||
|
@ -673,7 +673,7 @@ static int hdmi4_init_output(struct omap_hdmi *hdmi)
|
||||
out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
|
||||
out->ops = &hdmi_ops;
|
||||
out->owner = THIS_MODULE;
|
||||
out->of_ports = BIT(0);
|
||||
out->of_port = 0;
|
||||
out->ops_flags = OMAP_DSS_DEVICE_OP_EDID;
|
||||
|
||||
r = omapdss_device_init_output(out);
|
||||
|
@ -657,7 +657,7 @@ static int hdmi5_init_output(struct omap_hdmi *hdmi)
|
||||
out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
|
||||
out->ops = &hdmi_ops;
|
||||
out->owner = THIS_MODULE;
|
||||
out->of_ports = BIT(0);
|
||||
out->of_port = 0;
|
||||
out->ops_flags = OMAP_DSS_DEVICE_OP_EDID;
|
||||
|
||||
r = omapdss_device_init_output(out);
|
||||
|
@ -436,8 +436,8 @@ struct omap_dss_device {
|
||||
/* output instance */
|
||||
enum omap_dss_output_id id;
|
||||
|
||||
/* bitmask of port numbers in DT */
|
||||
unsigned int of_ports;
|
||||
/* port number in DT */
|
||||
unsigned int of_port;
|
||||
};
|
||||
|
||||
struct omap_dss_driver {
|
||||
|
@ -4,7 +4,6 @@
|
||||
* Author: Archit Taneja <archit@ti.com>
|
||||
*/
|
||||
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
@ -24,7 +23,7 @@ int omapdss_device_init_output(struct omap_dss_device *out)
|
||||
int ret;
|
||||
|
||||
remote_node = of_graph_get_remote_node(out->dev->of_node,
|
||||
ffs(out->of_ports) - 1, 0);
|
||||
out->of_port, 0);
|
||||
if (!remote_node) {
|
||||
dev_dbg(out->dev, "failed to find video sink\n");
|
||||
return 0;
|
||||
|
@ -265,7 +265,7 @@ static int sdi_init_output(struct sdi_device *sdi)
|
||||
out->name = "sdi.0";
|
||||
out->dispc_channel = OMAP_DSS_CHANNEL_LCD;
|
||||
/* We have SDI only on OMAP3, where it's on port 1 */
|
||||
out->of_ports = BIT(1);
|
||||
out->of_port = 1;
|
||||
out->ops = &sdi_ops;
|
||||
out->owner = THIS_MODULE;
|
||||
out->bus_flags = DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE /* 15.5.9.1.2 */
|
||||
|
@ -754,7 +754,7 @@ static int venc_init_output(struct venc_device *venc)
|
||||
out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
|
||||
out->ops = &venc_ops;
|
||||
out->owner = THIS_MODULE;
|
||||
out->of_ports = BIT(0);
|
||||
out->of_port = 0;
|
||||
out->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
|
||||
|
||||
r = omapdss_device_init_output(out);
|
||||
|
Loading…
Reference in New Issue
Block a user