mirror of https://github.com/parazyd/arm-sdk.git
Revert "Add and rebase sre's droid4 patches for linux 4.16-rc1."
This reverts commit 3f9238ed77.
This commit is contained in:
parent
7efcb3d202
commit
6b61bec7be
|
|
@ -0,0 +1,31 @@
|
|||
From a7129365bbffa136d3987e9ae8480337882f753a Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
Date: Mon, 24 Jul 2017 19:32:58 +0200
|
||||
Subject: [PATCH 01/17] drm/omap: remove unused function defines
|
||||
|
||||
Remove driver (un)register API defines. They do not even exist
|
||||
anymore.
|
||||
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
Acked-by: Pavel Machek <pavel@ucw.cz>
|
||||
---
|
||||
drivers/gpu/drm/omapdrm/dss/omapdss.h | 3 ---
|
||||
1 file changed, 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
|
||||
index 47a3316..3d25359 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
|
||||
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
|
||||
@@ -584,9 +584,6 @@ struct omap_dss_driver {
|
||||
|
||||
bool omapdss_is_initialized(void);
|
||||
|
||||
-int omap_dss_register_driver(struct omap_dss_driver *);
|
||||
-void omap_dss_unregister_driver(struct omap_dss_driver *);
|
||||
-
|
||||
int omapdss_register_display(struct omap_dss_device *dssdev);
|
||||
void omapdss_unregister_display(struct omap_dss_device *dssdev);
|
||||
|
||||
--
|
||||
2.1.4
|
||||
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
From faf0e2475147bd8e755dbce7f9f1a0fb8e731e4f Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
Date: Mon, 24 Jul 2017 19:32:59 +0200
|
||||
Subject: [PATCH 02/17] drm/omap: drop incorrect comment
|
||||
|
||||
The wrappers have been removed in commit 5a35876e2830
|
||||
(drm: omapdrm: Remove manual update display support)
|
||||
and will not be reintroduced, since the normal sys
|
||||
functions properly call the dirty callback.
|
||||
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
Acked-by: Pavel Machek <pavel@ucw.cz>
|
||||
---
|
||||
drivers/gpu/drm/omapdrm/omap_fbdev.c | 3 ---
|
||||
1 file changed, 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/omapdrm/omap_fbdev.c b/drivers/gpu/drm/omapdrm/omap_fbdev.c
|
||||
index 9273118..e037818 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/omap_fbdev.c
|
||||
+++ b/drivers/gpu/drm/omapdrm/omap_fbdev.c
|
||||
@@ -84,9 +84,6 @@ static struct fb_ops omap_fb_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
DRM_FB_HELPER_DEFAULT_OPS,
|
||||
|
||||
- /* Note: to properly handle manual update displays, we wrap the
|
||||
- * basic fbdev ops which write to the framebuffer
|
||||
- */
|
||||
.fb_read = drm_fb_helper_sys_read,
|
||||
.fb_write = drm_fb_helper_sys_write,
|
||||
.fb_fillrect = drm_fb_helper_sys_fillrect,
|
||||
--
|
||||
2.1.4
|
||||
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
From 8bb3dd3ffe60be576bd6a843ebb65979e49e3e25 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
Date: Mon, 24 Jul 2017 19:33:00 +0200
|
||||
Subject: [PATCH 03/17] drm/omap: plane: update fifo size on ovl setup
|
||||
|
||||
This is a workaround for a hardware bug occuring on OMAP3
|
||||
with manually updated panels. Details about the HW bug are
|
||||
unknown to me, but without this fix the panel refresh does
|
||||
not work at all on Nokia N950.
|
||||
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
---
|
||||
drivers/gpu/drm/omapdrm/dss/dispc.c | 16 ++++++++++++++++
|
||||
1 file changed, 16 insertions(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/omapdrm/dss/dispc.c b/drivers/gpu/drm/omapdrm/dss/dispc.c
|
||||
index 0f4fdb2..d5d2d3c 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/dss/dispc.c
|
||||
+++ b/drivers/gpu/drm/omapdrm/dss/dispc.c
|
||||
@@ -1491,6 +1491,18 @@ void dispc_ovl_compute_fifo_thresholds(enum omap_plane_id plane,
|
||||
}
|
||||
}
|
||||
|
||||
+void dispc_ovl_set_manual_fifo_threshold(enum omap_plane_id plane)
|
||||
+{
|
||||
+ u32 fifo_low, fifo_high;
|
||||
+ bool use_fifo_merge = false;
|
||||
+ bool use_manual_update = true;
|
||||
+
|
||||
+ dispc_ovl_compute_fifo_thresholds(plane, &fifo_low, &fifo_high,
|
||||
+ use_fifo_merge, use_manual_update);
|
||||
+
|
||||
+ dispc_ovl_set_fifo_threshold(plane, fifo_low, fifo_high);
|
||||
+}
|
||||
+
|
||||
static void dispc_ovl_set_mflag(enum omap_plane_id plane, bool enable)
|
||||
{
|
||||
int bit;
|
||||
@@ -2654,6 +2666,10 @@ static int dispc_ovl_setup(enum omap_plane_id plane,
|
||||
oi->zorder, oi->pre_mult_alpha, oi->global_alpha,
|
||||
oi->rotation_type, replication, vm, mem_to_mem);
|
||||
|
||||
+ /* manual mode needs other fifo thresholds */
|
||||
+ if (mgr_fld_read(channel, DISPC_MGR_FLD_STALLMODE))
|
||||
+ dispc_ovl_set_manual_fifo_threshold(plane);
|
||||
+
|
||||
return r;
|
||||
}
|
||||
|
||||
--
|
||||
2.1.4
|
||||
|
||||
|
|
@ -1,19 +1,23 @@
|
|||
From 8af6ec6efc7607cc5af52af895ac7f8e63820f80 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
Date: Mon, 24 Jul 2017 19:33:01 +0200
|
||||
Subject: [PATCH 04/17] drm/omap: add framedone interrupt support
|
||||
|
||||
This prepares framedone interrupt handling for
|
||||
manual display update support.
|
||||
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@xxxxxxxxxxxxxxx>
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
---
|
||||
drivers/gpu/drm/omapdrm/omap_crtc.c | 48 +++++++++++++++++++++++++++++++++++++
|
||||
drivers/gpu/drm/omapdrm/omap_crtc.h | 1 +
|
||||
drivers/gpu/drm/omapdrm/omap_drv.h | 2 ++
|
||||
drivers/gpu/drm/omapdrm/omap_irq.c | 24 +++++++++++++++++++
|
||||
drivers/gpu/drm/omapdrm/omap_irq.h | 1 +
|
||||
4 files changed, 74 insertions(+)
|
||||
3 files changed, 74 insertions(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
|
||||
index 1b8154e58d18..2278e3433008 100644
|
||||
index cc85c16..dee9b6e 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
|
||||
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
|
||||
@@ -51,6 +51,9 @@ struct omap_crtc {
|
||||
@@ -52,6 +52,9 @@ struct omap_crtc {
|
||||
bool pending;
|
||||
wait_queue_head_t pending_wait;
|
||||
struct drm_pending_vblank_event *event;
|
||||
|
|
@ -23,7 +27,7 @@ index 1b8154e58d18..2278e3433008 100644
|
|||
};
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
@@ -247,6 +250,17 @@ static int omap_crtc_dss_register_framedone(
|
||||
@@ -248,6 +251,17 @@ static int omap_crtc_dss_register_framedone(
|
||||
enum omap_channel channel,
|
||||
void (*handler)(void *), void *data)
|
||||
{
|
||||
|
|
@ -41,7 +45,7 @@ index 1b8154e58d18..2278e3433008 100644
|
|||
return 0;
|
||||
}
|
||||
|
||||
@@ -254,6 +268,16 @@ static void omap_crtc_dss_unregister_framedone(
|
||||
@@ -255,6 +269,16 @@ static void omap_crtc_dss_unregister_framedone(
|
||||
enum omap_channel channel,
|
||||
void (*handler)(void *), void *data)
|
||||
{
|
||||
|
|
@ -58,7 +62,7 @@ index 1b8154e58d18..2278e3433008 100644
|
|||
}
|
||||
|
||||
static const struct dss_mgr_ops mgr_ops = {
|
||||
@@ -321,6 +345,30 @@ void omap_crtc_vblank_irq(struct drm_crtc *crtc)
|
||||
@@ -322,6 +346,30 @@ void omap_crtc_vblank_irq(struct drm_crtc *crtc)
|
||||
DBG("%s: apply done", omap_crtc->name);
|
||||
}
|
||||
|
||||
|
|
@ -89,22 +93,31 @@ index 1b8154e58d18..2278e3433008 100644
|
|||
static void omap_crtc_write_crtc_properties(struct drm_crtc *crtc)
|
||||
{
|
||||
struct omap_drm_private *priv = crtc->dev->dev_private;
|
||||
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.h b/drivers/gpu/drm/omapdrm/omap_crtc.h
|
||||
index ad7b007c6174..bd316bc0b6f4 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/omap_crtc.h
|
||||
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.h
|
||||
@@ -39,5 +39,6 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
|
||||
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
|
||||
index 4bd1e90..22f3d94 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/omap_drv.h
|
||||
+++ b/drivers/gpu/drm/omapdrm/omap_drv.h
|
||||
@@ -97,6 +97,7 @@ void omap_gem_describe_objects(struct list_head *list, struct seq_file *m);
|
||||
int omap_gem_resume(struct device *dev);
|
||||
#endif
|
||||
|
||||
+int omap_irq_enable_framedone(struct drm_crtc *crtc, bool enable);
|
||||
int omap_irq_enable_vblank(struct drm_crtc *crtc);
|
||||
void omap_irq_disable_vblank(struct drm_crtc *crtc);
|
||||
void omap_drm_irq_uninstall(struct drm_device *dev);
|
||||
@@ -124,6 +125,7 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
|
||||
int omap_crtc_wait_pending(struct drm_crtc *crtc);
|
||||
void omap_crtc_error_irq(struct drm_crtc *crtc, uint32_t irqstatus);
|
||||
void omap_crtc_vblank_irq(struct drm_crtc *crtc);
|
||||
+void omap_crtc_framedone_irq(struct drm_crtc *crtc, uint32_t irqstatus);
|
||||
|
||||
#endif /* __OMAPDRM_CRTC_H__ */
|
||||
struct drm_plane *omap_plane_init(struct drm_device *dev,
|
||||
int idx, enum drm_plane_type type,
|
||||
diff --git a/drivers/gpu/drm/omapdrm/omap_irq.c b/drivers/gpu/drm/omapdrm/omap_irq.c
|
||||
index 53ba424823b2..354df3583229 100644
|
||||
index 013b0bb..301c0e7 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/omap_irq.c
|
||||
+++ b/drivers/gpu/drm/omapdrm/omap_irq.c
|
||||
@@ -85,6 +85,27 @@ int omap_irq_wait(struct drm_device *dev, struct omap_irq_wait *wait,
|
||||
@@ -87,6 +87,27 @@ int omap_irq_wait(struct drm_device *dev, struct omap_irq_wait *wait,
|
||||
return ret == 0 ? -1 : 0;
|
||||
}
|
||||
|
||||
|
|
@ -132,7 +145,7 @@ index 53ba424823b2..354df3583229 100644
|
|||
/**
|
||||
* enable_vblank - enable vblank interrupt events
|
||||
* @dev: DRM device
|
||||
@@ -215,6 +236,9 @@ static irqreturn_t omap_irq_handler(int irq, void *arg)
|
||||
@@ -217,6 +238,9 @@ static irqreturn_t omap_irq_handler(int irq, void *arg)
|
||||
|
||||
if (irqstatus & priv->dispc_ops->mgr_get_sync_lost_irq(channel))
|
||||
omap_crtc_error_irq(crtc, irqstatus);
|
||||
|
|
@ -142,17 +155,6 @@ index 53ba424823b2..354df3583229 100644
|
|||
}
|
||||
|
||||
omap_irq_ocp_error_handler(dev, irqstatus);
|
||||
diff --git a/drivers/gpu/drm/omapdrm/omap_irq.h b/drivers/gpu/drm/omapdrm/omap_irq.h
|
||||
index 606c09932bc0..69f4ff80a0e4 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/omap_irq.h
|
||||
+++ b/drivers/gpu/drm/omapdrm/omap_irq.h
|
||||
@@ -27,6 +27,7 @@ struct drm_device;
|
||||
struct omap_irq_wait;
|
||||
|
||||
int omap_irq_enable_vblank(struct drm_crtc *crtc);
|
||||
+int omap_irq_enable_framedone(struct drm_crtc *crtc, bool enable);
|
||||
void omap_irq_disable_vblank(struct drm_crtc *crtc);
|
||||
void omap_drm_irq_uninstall(struct drm_device *dev);
|
||||
int omap_drm_irq_install(struct drm_device *dev);
|
||||
--
|
||||
2.15.1
|
||||
2.1.4
|
||||
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
Introduce new "orientation" property for describing in which
|
||||
orientation a panel has been mounted to the device. This can
|
||||
be used by the operating system to automatically rotate the
|
||||
display correctly.
|
||||
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@xxxxxxxxxxxxxxx>
|
||||
---
|
||||
.../devicetree/bindings/display/panel/panel-common.txt | 12 ++++++++++++
|
||||
include/dt-bindings/display/common.h | 14 ++++++++++++++
|
||||
2 files changed, 26 insertions(+)
|
||||
create mode 100644 include/dt-bindings/display/common.h
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/display/panel/panel-common.txt b/Documentation/devicetree/bindings/display/panel/panel-common.txt
|
||||
index 557fa765adcb..c646b8908458 100644
|
||||
--- a/Documentation/devicetree/bindings/display/panel/panel-common.txt
|
||||
+++ b/Documentation/devicetree/bindings/display/panel/panel-common.txt
|
||||
@@ -18,6 +18,18 @@ Descriptive Properties
|
||||
physical area where images are displayed. These properties are expressed in
|
||||
millimeters and rounded to the closest unit.
|
||||
|
||||
+- orientation: The orientation property specifies the panel orientation
|
||||
+ in relation to the device's casing. The following values are possible:
|
||||
+
|
||||
+ * 0 = The top side of the panel matches the top side of the device's
|
||||
+ casing.
|
||||
+ * 1 = The top side of the panel matches the bottom side of the device's
|
||||
+ casing. In other words the panel is mounted upside-down.
|
||||
+ * 2 = The left side of the panel matches the top side of the device's
|
||||
+ casing.
|
||||
+ * 3 = The right side of the panel matches the top side of the device's
|
||||
+ casing.
|
||||
+
|
||||
- label: The label property specifies a symbolic name for the panel as a
|
||||
string suitable for use by humans. It typically contains a name inscribed on
|
||||
the system (e.g. as an affixed label) or specified in the system's
|
||||
diff --git a/include/dt-bindings/display/common.h b/include/dt-bindings/display/common.h
|
||||
new file mode 100644
|
||||
index 000000000000..a864775445a0
|
||||
--- /dev/null
|
||||
+++ b/include/dt-bindings/display/common.h
|
||||
@@ -0,0 +1,14 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0 */
|
||||
+/*
|
||||
+ * This header provides common constants for displays
|
||||
+ */
|
||||
+
|
||||
+#ifndef _DT_BINDINGS_DISPLAY_COMMON_H
|
||||
+#define _DT_BINDINGS_DISPLAY_COMMON_H
|
||||
+
|
||||
+#define PANEL_ORIENTATION_NORMAL 0
|
||||
+#define PANEL_ORIENTATION_BOTTOM_UP 1
|
||||
+#define PANEL_ORIENTATION_LEFT_UP 2
|
||||
+#define PANEL_ORIENTATION_RIGHT_UP 3
|
||||
+
|
||||
+#endif
|
||||
--
|
||||
2.15.1
|
||||
|
|
@ -1,18 +1,23 @@
|
|||
From 6dae0575adf3b15c51832bfa8c0320e8526e9b8e Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
Date: Mon, 24 Jul 2017 19:33:02 +0200
|
||||
Subject: [PATCH 05/17] drm/omap: add manual update detection helper
|
||||
|
||||
In preparation for manually updated display support, such as DSI
|
||||
command mode panels, this adds a simple helper to see if a connector
|
||||
is manually updated.
|
||||
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@xxxxxxxxxxxxxxx>
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
---
|
||||
drivers/gpu/drm/omapdrm/omap_connector.c | 8 ++++++++
|
||||
drivers/gpu/drm/omapdrm/omap_connector.h | 1 +
|
||||
drivers/gpu/drm/omapdrm/omap_drv.h | 1 +
|
||||
2 files changed, 9 insertions(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
|
||||
index a0d7b1d905e8..a33b51484b2d 100644
|
||||
index aa5ba9a..4f4c7ef 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
|
||||
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
|
||||
@@ -57,6 +57,14 @@ bool omap_connector_get_hdmi_mode(struct drm_connector *connector)
|
||||
@@ -59,6 +59,14 @@ bool omap_connector_get_hdmi_mode(struct drm_connector *connector)
|
||||
return omap_connector->hdmi_mode;
|
||||
}
|
||||
|
||||
|
|
@ -27,16 +32,18 @@ index a0d7b1d905e8..a33b51484b2d 100644
|
|||
static enum drm_connector_status omap_connector_detect(
|
||||
struct drm_connector *connector, bool force)
|
||||
{
|
||||
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.h b/drivers/gpu/drm/omapdrm/omap_connector.h
|
||||
index 98bbc779b302..652136d167f5 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/omap_connector.h
|
||||
+++ b/drivers/gpu/drm/omapdrm/omap_connector.h
|
||||
@@ -33,5 +33,6 @@ struct drm_connector *omap_connector_init(struct drm_device *dev,
|
||||
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
|
||||
index 22f3d94..f6c48f2 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/omap_drv.h
|
||||
+++ b/drivers/gpu/drm/omapdrm/omap_drv.h
|
||||
@@ -142,6 +142,7 @@ struct drm_connector *omap_connector_init(struct drm_device *dev,
|
||||
struct drm_encoder *omap_connector_attached_encoder(
|
||||
struct drm_connector *connector);
|
||||
bool omap_connector_get_hdmi_mode(struct drm_connector *connector);
|
||||
+bool omap_connector_get_manually_updated(struct drm_connector *connector);
|
||||
|
||||
#endif /* __OMAPDRM_CONNECTOR_H__ */
|
||||
struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
--
|
||||
2.15.1
|
||||
2.1.4
|
||||
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
This adds support for setting DRM panel orientation property
|
||||
based on information from the display driver.
|
||||
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@xxxxxxxxxxxxxxx>
|
||||
---
|
||||
drivers/gpu/drm/omapdrm/dss/omapdss.h | 2 ++
|
||||
drivers/gpu/drm/omapdrm/omap_connector.c | 10 +++++++++-
|
||||
2 files changed, 11 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
|
||||
index f8f83e826a56..72ebd82409d3 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
|
||||
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
|
||||
@@ -565,6 +565,8 @@ struct omap_dss_driver {
|
||||
struct videomode *vm);
|
||||
void (*get_size)(struct omap_dss_device *dssdev,
|
||||
unsigned int *width, unsigned int *height);
|
||||
+ void (*get_orientation)(struct omap_dss_device *dssdev,
|
||||
+ int *orientation);
|
||||
|
||||
int (*set_wss)(struct omap_dss_device *dssdev, u32 wss);
|
||||
u32 (*get_wss)(struct omap_dss_device *dssdev);
|
||||
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
|
||||
index a33b51484b2d..2f296d29b74b 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
|
||||
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
|
||||
@@ -249,6 +249,7 @@ struct drm_connector *omap_connector_init(struct drm_device *dev,
|
||||
struct drm_connector *connector = NULL;
|
||||
struct omap_connector *omap_connector;
|
||||
bool hpd_supported = false;
|
||||
+ int ret;
|
||||
|
||||
DBG("%s", dssdev->name);
|
||||
|
||||
@@ -267,7 +268,7 @@ struct drm_connector *omap_connector_init(struct drm_device *dev,
|
||||
drm_connector_helper_add(connector, &omap_connector_helper_funcs);
|
||||
|
||||
if (dssdev->driver->register_hpd_cb) {
|
||||
- int ret = dssdev->driver->register_hpd_cb(dssdev,
|
||||
+ ret = dssdev->driver->register_hpd_cb(dssdev,
|
||||
omap_connector_hpd_cb,
|
||||
omap_connector);
|
||||
if (!ret)
|
||||
@@ -288,6 +289,13 @@ struct drm_connector *omap_connector_init(struct drm_device *dev,
|
||||
connector->interlace_allowed = 1;
|
||||
connector->doublescan_allowed = 0;
|
||||
|
||||
+ if (dssdev->driver->get_orientation)
|
||||
+ dssdev->driver->get_orientation(dssdev, &connector->display_info.panel_orientation);
|
||||
+
|
||||
+ ret = drm_connector_init_panel_orientation_property(connector, 0, 0);
|
||||
+ if (ret)
|
||||
+ DBG("%s: Failed to init orientation property (%d)", dssdev->name, ret);
|
||||
+
|
||||
return connector;
|
||||
|
||||
fail:
|
||||
--
|
||||
2.15.1
|
||||
|
|
@ -1,3 +1,8 @@
|
|||
From 2a51a11e2f2705bbf7642e2e08ae6b2f1372d79c Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
Date: Mon, 24 Jul 2017 19:33:03 +0200
|
||||
Subject: [PATCH 06/17] drm/omap: add support for manually updated displays
|
||||
|
||||
This adds the required infrastructure for manually
|
||||
updated displays, such as DSI command mode panels.
|
||||
|
||||
|
|
@ -11,18 +16,18 @@ console and for Xorg. Weston currently does not
|
|||
implement this and is known not to work on manually
|
||||
updated displays.
|
||||
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@xxxxxxxxxxxxxxx>
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
---
|
||||
drivers/gpu/drm/omapdrm/omap_crtc.c | 110 +++++++++++++++++++++++++++++++++---
|
||||
drivers/gpu/drm/omapdrm/omap_crtc.h | 1 +
|
||||
drivers/gpu/drm/omapdrm/omap_drv.h | 1 +
|
||||
drivers/gpu/drm/omapdrm/omap_fb.c | 20 +++++++
|
||||
3 files changed, 123 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
|
||||
index 2278e3433008..c2defb514b9f 100644
|
||||
index dee9b6e..8255241 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
|
||||
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
|
||||
@@ -51,6 +51,7 @@ struct omap_crtc {
|
||||
@@ -52,6 +52,7 @@ struct omap_crtc {
|
||||
bool pending;
|
||||
wait_queue_head_t pending_wait;
|
||||
struct drm_pending_vblank_event *event;
|
||||
|
|
@ -30,7 +35,7 @@ index 2278e3433008..c2defb514b9f 100644
|
|||
|
||||
void (*framedone_handler)(void *);
|
||||
void *framedone_handler_data;
|
||||
@@ -142,6 +143,28 @@ static void omap_crtc_dss_disconnect(enum omap_channel channel,
|
||||
@@ -143,6 +144,28 @@ static void omap_crtc_dss_disconnect(enum omap_channel channel,
|
||||
|
||||
static void omap_crtc_dss_start_update(enum omap_channel channel)
|
||||
{
|
||||
|
|
@ -59,7 +64,7 @@ index 2278e3433008..c2defb514b9f 100644
|
|||
}
|
||||
|
||||
/* Called only from the encoder enable/disable and suspend/resume handlers. */
|
||||
@@ -153,12 +176,17 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable)
|
||||
@@ -154,12 +177,17 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable)
|
||||
enum omap_channel channel = omap_crtc->channel;
|
||||
struct omap_irq_wait *wait;
|
||||
u32 framedone_irq, vsync_irq;
|
||||
|
|
@ -78,7 +83,7 @@ index 2278e3433008..c2defb514b9f 100644
|
|||
priv->dispc_ops->mgr_enable(channel, enable);
|
||||
omap_crtc->enabled = enable;
|
||||
return;
|
||||
@@ -209,7 +237,6 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable)
|
||||
@@ -210,7 +238,6 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -86,7 +91,7 @@ index 2278e3433008..c2defb514b9f 100644
|
|||
static int omap_crtc_dss_enable(enum omap_channel channel)
|
||||
{
|
||||
struct omap_crtc *omap_crtc = omap_crtcs[channel];
|
||||
@@ -369,6 +396,53 @@ void omap_crtc_framedone_irq(struct drm_crtc *crtc, uint32_t irqstatus)
|
||||
@@ -370,6 +397,53 @@ void omap_crtc_framedone_irq(struct drm_crtc *crtc, uint32_t irqstatus)
|
||||
wake_up(&omap_crtc->pending_wait);
|
||||
}
|
||||
|
||||
|
|
@ -140,7 +145,7 @@ index 2278e3433008..c2defb514b9f 100644
|
|||
static void omap_crtc_write_crtc_properties(struct drm_crtc *crtc)
|
||||
{
|
||||
struct omap_drm_private *priv = crtc->dev->dev_private;
|
||||
@@ -421,6 +495,10 @@ static void omap_crtc_atomic_enable(struct drm_crtc *crtc,
|
||||
@@ -422,6 +496,10 @@ static void omap_crtc_atomic_enable(struct drm_crtc *crtc,
|
||||
|
||||
DBG("%s", omap_crtc->name);
|
||||
|
||||
|
|
@ -151,7 +156,7 @@ index 2278e3433008..c2defb514b9f 100644
|
|||
spin_lock_irq(&crtc->dev->event_lock);
|
||||
drm_crtc_vblank_on(crtc);
|
||||
ret = drm_crtc_vblank_get(crtc);
|
||||
@@ -434,6 +512,7 @@ static void omap_crtc_atomic_disable(struct drm_crtc *crtc,
|
||||
@@ -435,6 +513,7 @@ static void omap_crtc_atomic_disable(struct drm_crtc *crtc,
|
||||
struct drm_crtc_state *old_state)
|
||||
{
|
||||
struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
|
||||
|
|
@ -159,7 +164,7 @@ index 2278e3433008..c2defb514b9f 100644
|
|||
|
||||
DBG("%s", omap_crtc->name);
|
||||
|
||||
@@ -444,6 +523,11 @@ static void omap_crtc_atomic_disable(struct drm_crtc *crtc,
|
||||
@@ -445,6 +524,11 @@ static void omap_crtc_atomic_disable(struct drm_crtc *crtc,
|
||||
}
|
||||
spin_unlock_irq(&crtc->dev->event_lock);
|
||||
|
||||
|
|
@ -171,7 +176,7 @@ index 2278e3433008..c2defb514b9f 100644
|
|||
drm_crtc_vblank_off(crtc);
|
||||
}
|
||||
|
||||
@@ -593,13 +677,20 @@ static void omap_crtc_atomic_flush(struct drm_crtc *crtc,
|
||||
@@ -559,13 +643,20 @@ static void omap_crtc_atomic_flush(struct drm_crtc *crtc,
|
||||
|
||||
DBG("%s: GO", omap_crtc->name);
|
||||
|
||||
|
|
@ -198,7 +203,7 @@ index 2278e3433008..c2defb514b9f 100644
|
|||
}
|
||||
|
||||
static int omap_crtc_atomic_set_property(struct drm_crtc *crtc,
|
||||
@@ -761,6 +852,9 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
|
||||
@@ -726,6 +817,9 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
|
||||
omap_crtc->channel = channel;
|
||||
omap_crtc->name = channel_names[channel];
|
||||
|
||||
|
|
@ -208,22 +213,23 @@ index 2278e3433008..c2defb514b9f 100644
|
|||
ret = drm_crtc_init_with_planes(dev, crtc, plane, NULL,
|
||||
&omap_crtc_funcs, NULL);
|
||||
if (ret < 0) {
|
||||
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.h b/drivers/gpu/drm/omapdrm/omap_crtc.h
|
||||
index bd316bc0b6f4..b61c94b34f04 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/omap_crtc.h
|
||||
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.h
|
||||
@@ -40,5 +40,6 @@ int omap_crtc_wait_pending(struct drm_crtc *crtc);
|
||||
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
|
||||
index f6c48f2..3cb9f9a 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/omap_drv.h
|
||||
+++ b/drivers/gpu/drm/omapdrm/omap_drv.h
|
||||
@@ -126,6 +126,7 @@ int omap_crtc_wait_pending(struct drm_crtc *crtc);
|
||||
void omap_crtc_error_irq(struct drm_crtc *crtc, uint32_t irqstatus);
|
||||
void omap_crtc_vblank_irq(struct drm_crtc *crtc);
|
||||
void omap_crtc_framedone_irq(struct drm_crtc *crtc, uint32_t irqstatus);
|
||||
+void omap_crtc_flush(struct drm_crtc *crtc);
|
||||
|
||||
#endif /* __OMAPDRM_CRTC_H__ */
|
||||
struct drm_plane *omap_plane_init(struct drm_device *dev,
|
||||
int idx, enum drm_plane_type type,
|
||||
diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c b/drivers/gpu/drm/omapdrm/omap_fb.c
|
||||
index b2539a90e1a4..57b1767bef09 100644
|
||||
index b1a762b..9492be6 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/omap_fb.c
|
||||
+++ b/drivers/gpu/drm/omapdrm/omap_fb.c
|
||||
@@ -95,8 +95,28 @@ static void omap_framebuffer_destroy(struct drm_framebuffer *fb)
|
||||
@@ -97,8 +97,28 @@ static void omap_framebuffer_destroy(struct drm_framebuffer *fb)
|
||||
kfree(omap_fb);
|
||||
}
|
||||
|
||||
|
|
@ -253,4 +259,5 @@ index b2539a90e1a4..57b1767bef09 100644
|
|||
};
|
||||
|
||||
--
|
||||
2.15.1
|
||||
2.1.4
|
||||
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
Add support to inform the DRM subsystem about the orientation
|
||||
the display has been mounted to the casing.
|
||||
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@xxxxxxxxxxxxxxx>
|
||||
---
|
||||
drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c | 13 +++++++++++++
|
||||
1 file changed, 13 insertions(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
|
||||
index 15399a1a666b..7a63d6775a27 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
|
||||
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
|
||||
@@ -68,6 +68,7 @@ struct panel_drv_data {
|
||||
|
||||
int width_mm;
|
||||
int height_mm;
|
||||
+ int orientation;
|
||||
|
||||
struct omap_dsi_pin_config pin_config;
|
||||
|
||||
@@ -1198,6 +1199,14 @@ static void dsicm_get_size(struct omap_dss_device *dssdev,
|
||||
*height = ddata->height_mm;
|
||||
}
|
||||
|
||||
+static void dsicm_get_orientation(struct omap_dss_device *dssdev,
|
||||
+ int *orientation)
|
||||
+{
|
||||
+ struct panel_drv_data *ddata = to_panel_data(dssdev);
|
||||
+
|
||||
+ *orientation = ddata->orientation;
|
||||
+}
|
||||
+
|
||||
static struct omap_dss_driver dsicm_ops = {
|
||||
.connect = dsicm_connect,
|
||||
.disconnect = dsicm_disconnect,
|
||||
@@ -1211,6 +1220,7 @@ static struct omap_dss_driver dsicm_ops = {
|
||||
.get_timings = dsicm_get_timings,
|
||||
.check_timings = dsicm_check_timings,
|
||||
.get_size = dsicm_get_size,
|
||||
+ .get_orientation = dsicm_get_orientation,
|
||||
|
||||
.enable_te = dsicm_enable_te,
|
||||
.get_te = dsicm_get_te,
|
||||
@@ -1259,6 +1269,9 @@ static int dsicm_probe_of(struct platform_device *pdev)
|
||||
ddata->height_mm = 0;
|
||||
of_property_read_u32(node, "height-mm", &ddata->height_mm);
|
||||
|
||||
+ ddata->orientation = DRM_MODE_PANEL_ORIENTATION_UNKNOWN;
|
||||
+ of_property_read_u32(node, "orientation", &ddata->orientation);
|
||||
+
|
||||
in = omapdss_of_find_source_for_first_ep(node);
|
||||
if (IS_ERR(in)) {
|
||||
dev_err(&pdev->dev, "failed to find video source\n");
|
||||
--
|
||||
2.15.1
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
From 1e66c0a2f776d6054c2324daf55fc3e3df126c33 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
Date: Mon, 24 Jul 2017 19:33:04 +0200
|
||||
Subject: [PATCH 07/17] drm/omap: add support for physical size hints from
|
||||
display drivers
|
||||
|
||||
While physical size information is automatically parsed for EDID
|
||||
based displays, we need to provide it manually for displays providing
|
||||
one fixed mode.
|
||||
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
Acked-by: Pavel Machek <pavel@ucw.cz>
|
||||
---
|
||||
drivers/gpu/drm/omapdrm/dss/omapdss.h | 2 ++
|
||||
drivers/gpu/drm/omapdrm/omap_connector.c | 6 ++++++
|
||||
2 files changed, 8 insertions(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
|
||||
index 3d25359..5be6ff8 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
|
||||
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
|
||||
@@ -562,6 +562,8 @@ struct omap_dss_driver {
|
||||
struct videomode *vm);
|
||||
void (*get_timings)(struct omap_dss_device *dssdev,
|
||||
struct videomode *vm);
|
||||
+ void (*get_size)(struct omap_dss_device *dssdev,
|
||||
+ unsigned int *width, unsigned int *height);
|
||||
|
||||
int (*set_wss)(struct omap_dss_device *dssdev, u32 wss);
|
||||
u32 (*get_wss)(struct omap_dss_device *dssdev);
|
||||
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
|
||||
index 4f4c7ef..8874f55 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
|
||||
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
|
||||
@@ -157,6 +157,12 @@ static int omap_connector_get_modes(struct drm_connector *connector)
|
||||
drm_mode_set_name(mode);
|
||||
drm_mode_probed_add(connector, mode);
|
||||
|
||||
+ if (dssdrv->get_size) {
|
||||
+ dssdrv->get_size(dssdev,
|
||||
+ &connector->display_info.width_mm,
|
||||
+ &connector->display_info.height_mm);
|
||||
+ }
|
||||
+
|
||||
n = 1;
|
||||
}
|
||||
|
||||
--
|
||||
2.1.4
|
||||
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
This adds a LCD panel orientation hint to the Droid 4. If the
|
||||
display is rotated this way the keyboard can be used properly.
|
||||
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@xxxxxxxxxxxxxxx>
|
||||
---
|
||||
arch/arm/boot/dts/omap4-droid4-xt894.dts | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/arch/arm/boot/dts/omap4-droid4-xt894.dts b/arch/arm/boot/dts/omap4-droid4-xt894.dts
|
||||
index b21084da490b..e11a24397163 100644
|
||||
--- a/arch/arm/boot/dts/omap4-droid4-xt894.dts
|
||||
+++ b/arch/arm/boot/dts/omap4-droid4-xt894.dts
|
||||
@@ -6,6 +6,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
#include <dt-bindings/input/input.h>
|
||||
+#include <dt-bindings/display/common.h>
|
||||
#include "omap443x.dtsi"
|
||||
#include "motorola-cpcap-mapphone.dtsi"
|
||||
|
||||
@@ -181,6 +182,8 @@
|
||||
height-mm = <89>;
|
||||
backlight = <&lcd_backlight>;
|
||||
|
||||
+ orientation = <PANEL_ORIENTATION_RIGHT_UP>;
|
||||
+
|
||||
panel-timing {
|
||||
clock-frequency = <0>; /* Calculated by dsi */
|
||||
|
||||
--
|
||||
2.15.1
|
||||
|
|
@ -0,0 +1,124 @@
|
|||
From 328a31aeb9e4cb56f312be7722010ede59ef96be Mon Sep 17 00:00:00 2001
|
||||
From: Tony Lindgren <tony@atomide.com>
|
||||
Date: Mon, 24 Jul 2017 19:33:05 +0200
|
||||
Subject: [PATCH 08/17] drm/omap: panel-dsi-cm: fix driver
|
||||
|
||||
This adds support for get_timings() and check_timings()
|
||||
to get the driver working and properly initializes the
|
||||
timing information from DT.
|
||||
|
||||
Signed-off-by: Tony Lindgren <tony@atomide.com>
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
---
|
||||
drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c | 56 ++++++++++++++++++++++---
|
||||
1 file changed, 51 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
|
||||
index 92c556a..905b717 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
|
||||
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <linux/of_gpio.h>
|
||||
|
||||
#include <video/mipi_display.h>
|
||||
+#include <video/of_display_timing.h>
|
||||
|
||||
#include "../dss/omapdss.h"
|
||||
|
||||
@@ -1099,6 +1100,36 @@ static void dsicm_ulps_work(struct work_struct *work)
|
||||
mutex_unlock(&ddata->lock);
|
||||
}
|
||||
|
||||
+static void dsicm_get_timings(struct omap_dss_device *dssdev,
|
||||
+ struct videomode *vm)
|
||||
+{
|
||||
+ struct panel_drv_data *ddata = to_panel_data(dssdev);
|
||||
+
|
||||
+ *vm = ddata->vm;
|
||||
+}
|
||||
+
|
||||
+static int dsicm_check_timings(struct omap_dss_device *dssdev,
|
||||
+ struct videomode *vm)
|
||||
+{
|
||||
+ struct panel_drv_data *ddata = to_panel_data(dssdev);
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ if (vm->hactive != ddata->vm.hactive)
|
||||
+ ret = -EINVAL;
|
||||
+
|
||||
+ if (vm->vactive != ddata->vm.vactive)
|
||||
+ ret = -EINVAL;
|
||||
+
|
||||
+ if (ret) {
|
||||
+ dev_warn(dssdev->dev, "wrong resolution: %d x %d",
|
||||
+ vm->hactive, vm->vactive);
|
||||
+ dev_warn(dssdev->dev, "panel resolution: %d x %d",
|
||||
+ ddata->vm.hactive, ddata->vm.vactive);
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static struct omap_dss_driver dsicm_ops = {
|
||||
.connect = dsicm_connect,
|
||||
.disconnect = dsicm_disconnect,
|
||||
@@ -1109,6 +1140,9 @@ static struct omap_dss_driver dsicm_ops = {
|
||||
.update = dsicm_update,
|
||||
.sync = dsicm_sync,
|
||||
|
||||
+ .get_timings = dsicm_get_timings,
|
||||
+ .check_timings = dsicm_check_timings,
|
||||
+
|
||||
.enable_te = dsicm_enable_te,
|
||||
.get_te = dsicm_get_te,
|
||||
|
||||
@@ -1120,7 +1154,8 @@ static int dsicm_probe_of(struct platform_device *pdev)
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
struct panel_drv_data *ddata = platform_get_drvdata(pdev);
|
||||
struct omap_dss_device *in;
|
||||
- int gpio;
|
||||
+ struct display_timing timing;
|
||||
+ int gpio, err;
|
||||
|
||||
gpio = of_get_named_gpio(node, "reset-gpios", 0);
|
||||
if (!gpio_is_valid(gpio)) {
|
||||
@@ -1137,6 +1172,17 @@ static int dsicm_probe_of(struct platform_device *pdev)
|
||||
return gpio;
|
||||
}
|
||||
|
||||
+ err = of_get_display_timing(node, "panel-timing", &timing);
|
||||
+ if (!err) {
|
||||
+ videomode_from_timing(&timing, &ddata->vm);
|
||||
+ if (!ddata->vm.pixelclock)
|
||||
+ ddata->vm.pixelclock =
|
||||
+ ddata->vm.hactive * ddata->vm.vactive * 60;
|
||||
+ } else {
|
||||
+ dev_warn(&pdev->dev,
|
||||
+ "failed to get video timing, using defaults\n");
|
||||
+ }
|
||||
+
|
||||
in = omapdss_of_find_source_for_first_ep(node);
|
||||
if (IS_ERR(in)) {
|
||||
dev_err(&pdev->dev, "failed to find video source\n");
|
||||
@@ -1171,14 +1217,14 @@ static int dsicm_probe(struct platform_device *pdev)
|
||||
if (!pdev->dev.of_node)
|
||||
return -ENODEV;
|
||||
|
||||
- r = dsicm_probe_of(pdev);
|
||||
- if (r)
|
||||
- return r;
|
||||
-
|
||||
ddata->vm.hactive = 864;
|
||||
ddata->vm.vactive = 480;
|
||||
ddata->vm.pixelclock = 864 * 480 * 60;
|
||||
|
||||
+ r = dsicm_probe_of(pdev);
|
||||
+ if (r)
|
||||
+ return r;
|
||||
+
|
||||
dssdev = &ddata->dssdev;
|
||||
dssdev->dev = dev;
|
||||
dssdev->driver = &dsicm_ops;
|
||||
--
|
||||
2.1.4
|
||||
|
||||
|
|
@ -1,125 +0,0 @@
|
|||
This is a workaround for a hardware bug occuring on OMAP3
|
||||
with manually updated panels. Details about the HW bug are
|
||||
unknown to me, but without this fix the panel refresh does
|
||||
not work at all on Nokia N950. This is not the case for the
|
||||
OMAP4 based Droid 4, which works perfectly fine with default
|
||||
settings.
|
||||
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@xxxxxxxxxxxxxxx>
|
||||
---
|
||||
drivers/gpu/drm/omapdrm/dss/dispc.c | 36 +++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 35 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/omapdrm/dss/dispc.c b/drivers/gpu/drm/omapdrm/dss/dispc.c
|
||||
index 4e8f68efd169..0904c3201914 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/dss/dispc.c
|
||||
+++ b/drivers/gpu/drm/omapdrm/dss/dispc.c
|
||||
@@ -157,6 +157,8 @@ struct dispc_features {
|
||||
bool has_gamma_table:1;
|
||||
|
||||
bool has_gamma_i734_bug:1;
|
||||
+
|
||||
+ bool has_fifo_stallmode_bug:1;
|
||||
};
|
||||
|
||||
#define DISPC_MAX_NR_FIFOS 5
|
||||
@@ -1489,6 +1491,18 @@ void dispc_ovl_compute_fifo_thresholds(enum omap_plane_id plane,
|
||||
}
|
||||
}
|
||||
|
||||
+static void dispc_ovl_set_manual_fifo_threshold(enum omap_plane_id plane)
|
||||
+{
|
||||
+ u32 fifo_low, fifo_high;
|
||||
+ bool use_fifo_merge = false;
|
||||
+ bool use_manual_update = true;
|
||||
+
|
||||
+ dispc_ovl_compute_fifo_thresholds(plane, &fifo_low, &fifo_high,
|
||||
+ use_fifo_merge, use_manual_update);
|
||||
+
|
||||
+ dispc_ovl_set_fifo_threshold(plane, fifo_low, fifo_high);
|
||||
+}
|
||||
+
|
||||
static void dispc_ovl_set_mflag(enum omap_plane_id plane, bool enable)
|
||||
{
|
||||
int bit;
|
||||
@@ -2651,8 +2665,21 @@ static int dispc_ovl_setup(enum omap_plane_id plane,
|
||||
oi->out_width, oi->out_height, oi->fourcc, oi->rotation,
|
||||
oi->zorder, oi->pre_mult_alpha, oi->global_alpha,
|
||||
oi->rotation_type, replication, vm, mem_to_mem);
|
||||
+ if (r)
|
||||
+ return r;
|
||||
|
||||
- return r;
|
||||
+ /*
|
||||
+ * OMAP3 chips have non-working FIFO thresholds for manually updated
|
||||
+ * displays. The issue is not fully understood, but this workaround
|
||||
+ * fixes the issue. OMAP4 is known to work with default thresholds.
|
||||
+ */
|
||||
+ if (mgr_fld_read(channel, DISPC_MGR_FLD_STALLMODE) &&
|
||||
+ dispc.feat->has_fifo_stallmode_bug) {
|
||||
+ DSSDBG("Enable OMAP3 FIFO stallmode bug workaround!\n");
|
||||
+ dispc_ovl_set_manual_fifo_threshold(plane);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
int dispc_wb_setup(const struct omap_dss_writeback_info *wi,
|
||||
@@ -4067,6 +4094,7 @@ static const struct dispc_features omap24xx_dispc_feats = {
|
||||
.no_framedone_tv = true,
|
||||
.set_max_preload = false,
|
||||
.last_pixel_inc_missing = true,
|
||||
+ .has_fifo_stallmode_bug = true,
|
||||
};
|
||||
|
||||
static const struct dispc_features omap34xx_rev1_0_dispc_feats = {
|
||||
@@ -4101,6 +4129,7 @@ static const struct dispc_features omap34xx_rev1_0_dispc_feats = {
|
||||
.no_framedone_tv = true,
|
||||
.set_max_preload = false,
|
||||
.last_pixel_inc_missing = true,
|
||||
+ .has_fifo_stallmode_bug = true,
|
||||
};
|
||||
|
||||
static const struct dispc_features omap34xx_rev3_0_dispc_feats = {
|
||||
@@ -4135,6 +4164,7 @@ static const struct dispc_features omap34xx_rev3_0_dispc_feats = {
|
||||
.no_framedone_tv = true,
|
||||
.set_max_preload = false,
|
||||
.last_pixel_inc_missing = true,
|
||||
+ .has_fifo_stallmode_bug = true,
|
||||
};
|
||||
|
||||
static const struct dispc_features omap36xx_dispc_feats = {
|
||||
@@ -4169,6 +4199,7 @@ static const struct dispc_features omap36xx_dispc_feats = {
|
||||
.no_framedone_tv = true,
|
||||
.set_max_preload = false,
|
||||
.last_pixel_inc_missing = true,
|
||||
+ .has_fifo_stallmode_bug = true,
|
||||
};
|
||||
|
||||
static const struct dispc_features am43xx_dispc_feats = {
|
||||
@@ -4203,6 +4234,7 @@ static const struct dispc_features am43xx_dispc_feats = {
|
||||
.no_framedone_tv = true,
|
||||
.set_max_preload = false,
|
||||
.last_pixel_inc_missing = true,
|
||||
+ .has_fifo_stallmode_bug = false,
|
||||
};
|
||||
|
||||
static const struct dispc_features omap44xx_dispc_feats = {
|
||||
@@ -4242,6 +4274,7 @@ static const struct dispc_features omap44xx_dispc_feats = {
|
||||
.reverse_ilace_field_order = true,
|
||||
.has_gamma_table = true,
|
||||
.has_gamma_i734_bug = true,
|
||||
+ .has_fifo_stallmode_bug = false,
|
||||
};
|
||||
|
||||
static const struct dispc_features omap54xx_dispc_feats = {
|
||||
@@ -4282,6 +4315,7 @@ static const struct dispc_features omap54xx_dispc_feats = {
|
||||
.reverse_ilace_field_order = true,
|
||||
.has_gamma_table = true,
|
||||
.has_gamma_i734_bug = true,
|
||||
+ .has_fifo_stallmode_bug = false,
|
||||
};
|
||||
|
||||
static irqreturn_t dispc_irq_handler(int irq, void *arg)
|
||||
--
|
||||
2.15.1
|
||||
|
|
@ -0,0 +1,135 @@
|
|||
From 594f7f466237d32323f63c04e92f7ce7be2f2a4f Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
Date: Mon, 24 Jul 2017 19:33:06 +0200
|
||||
Subject: [PATCH 09/17] drm/omap: panel-dsi-cm: add regulator support
|
||||
|
||||
Add support for regulators used by panels found inside
|
||||
of the Nokia N950, N9 and Motorola Droid 4.
|
||||
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
---
|
||||
drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c | 57 +++++++++++++++++++++++--
|
||||
1 file changed, 53 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
|
||||
index 905b717..b98ea9e 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
|
||||
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_gpio.h>
|
||||
+#include <linux/regulator/consumer.h>
|
||||
|
||||
#include <video/mipi_display.h>
|
||||
#include <video/of_display_timing.h>
|
||||
@@ -60,6 +61,9 @@ struct panel_drv_data {
|
||||
int reset_gpio;
|
||||
int ext_te_gpio;
|
||||
|
||||
+ struct regulator *vpnl;
|
||||
+ struct regulator *vddi;
|
||||
+
|
||||
bool use_dsi_backlight;
|
||||
|
||||
struct omap_dsi_pin_config pin_config;
|
||||
@@ -590,25 +594,43 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
|
||||
.lp_clk_max = 10000000,
|
||||
};
|
||||
|
||||
+ if (ddata->vpnl) {
|
||||
+ r = regulator_enable(ddata->vpnl);
|
||||
+ if (r) {
|
||||
+ dev_err(&ddata->pdev->dev,
|
||||
+ "failed to enable VPNL: %d\n", r);
|
||||
+ return r;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (ddata->vddi) {
|
||||
+ r = regulator_enable(ddata->vddi);
|
||||
+ if (r) {
|
||||
+ dev_err(&ddata->pdev->dev,
|
||||
+ "failed to enable VDDI: %d\n", r);
|
||||
+ goto err_vpnl;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
if (ddata->pin_config.num_pins > 0) {
|
||||
r = in->ops.dsi->configure_pins(in, &ddata->pin_config);
|
||||
if (r) {
|
||||
dev_err(&ddata->pdev->dev,
|
||||
"failed to configure DSI pins\n");
|
||||
- goto err0;
|
||||
+ goto err_vddi;
|
||||
}
|
||||
}
|
||||
|
||||
r = in->ops.dsi->set_config(in, &dsi_config);
|
||||
if (r) {
|
||||
dev_err(&ddata->pdev->dev, "failed to configure DSI\n");
|
||||
- goto err0;
|
||||
+ goto err_vddi;
|
||||
}
|
||||
|
||||
r = in->ops.dsi->enable(in);
|
||||
if (r) {
|
||||
dev_err(&ddata->pdev->dev, "failed to enable DSI\n");
|
||||
- goto err0;
|
||||
+ goto err_vddi;
|
||||
}
|
||||
|
||||
dsicm_hw_reset(ddata);
|
||||
@@ -666,7 +688,13 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
|
||||
dsicm_hw_reset(ddata);
|
||||
|
||||
in->ops.dsi->disable(in, true, false);
|
||||
-err0:
|
||||
+err_vddi:
|
||||
+ if (ddata->vddi)
|
||||
+ regulator_disable(ddata->vddi);
|
||||
+err_vpnl:
|
||||
+ if (ddata->vpnl)
|
||||
+ regulator_disable(ddata->vpnl);
|
||||
+
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -689,6 +717,11 @@ static void dsicm_power_off(struct panel_drv_data *ddata)
|
||||
|
||||
in->ops.dsi->disable(in, true, false);
|
||||
|
||||
+ if (ddata->vddi)
|
||||
+ regulator_disable(ddata->vddi);
|
||||
+ if (ddata->vpnl)
|
||||
+ regulator_disable(ddata->vpnl);
|
||||
+
|
||||
ddata->enabled = 0;
|
||||
}
|
||||
|
||||
@@ -1189,6 +1222,22 @@ static int dsicm_probe_of(struct platform_device *pdev)
|
||||
return PTR_ERR(in);
|
||||
}
|
||||
|
||||
+ ddata->vpnl = devm_regulator_get_optional(&pdev->dev, "vpnl");
|
||||
+ if (IS_ERR(ddata->vpnl)) {
|
||||
+ err = PTR_ERR(ddata->vpnl);
|
||||
+ if (err == -EPROBE_DEFER)
|
||||
+ return err;
|
||||
+ ddata->vpnl = NULL;
|
||||
+ }
|
||||
+
|
||||
+ ddata->vddi = devm_regulator_get_optional(&pdev->dev, "vddi");
|
||||
+ if (IS_ERR(ddata->vddi)) {
|
||||
+ err = PTR_ERR(ddata->vddi);
|
||||
+ if (err == -EPROBE_DEFER)
|
||||
+ return err;
|
||||
+ ddata->vddi = NULL;
|
||||
+ }
|
||||
+
|
||||
ddata->in = in;
|
||||
|
||||
/* TODO: ulps, backlight */
|
||||
--
|
||||
2.1.4
|
||||
|
||||
|
|
@ -1,67 +0,0 @@
|
|||
From: Sebastian Reichel <sebastian.reichel@xxxxxxxxxxxxxxx>
|
||||
|
||||
Update the Droid 4 devicetree to properly describe the reset
|
||||
GPIO. Also rename the node to touchscreen instead of tsp,
|
||||
which seems to be commonly used for touchscreens.
|
||||
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@xxxxxxxxxxxxxxx>
|
||||
---
|
||||
arch/arm/boot/dts/omap4-droid4-xt894.dts | 22 ++++++----------------
|
||||
1 file changed, 6 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/boot/dts/omap4-droid4-xt894.dts b/arch/arm/boot/dts/omap4-droid4-xt894.dts
|
||||
index 81c701929c70..40df997fc453 100644
|
||||
--- a/arch/arm/boot/dts/omap4-droid4-xt894.dts
|
||||
+++ b/arch/arm/boot/dts/omap4-droid4-xt894.dts
|
||||
@@ -145,13 +145,6 @@
|
||||
};
|
||||
|
||||
&gpio6 {
|
||||
- touchscreen_reset {
|
||||
- gpio-hog;
|
||||
- gpios = <13 0>;
|
||||
- output-high;
|
||||
- line-name = "touchscreen-reset";
|
||||
- };
|
||||
-
|
||||
pwm8: dmtimer-pwm-8 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&vibrator_direction_pin>;
|
||||
@@ -385,22 +378,18 @@
|
||||
};
|
||||
};
|
||||
|
||||
-/*
|
||||
- * REVISIT: Add gpio173 reset pin handling to the driver, see gpio-hog above.
|
||||
- * If the GPIO reset is used, we probably need to have /lib/firmware/maxtouch.fw
|
||||
- * available. See "mxt-app" and "droid4-touchscreen-firmware" tools for more
|
||||
- * information.
|
||||
- */
|
||||
&i2c2 {
|
||||
- tsp@4a {
|
||||
+ touchscreen@4a {
|
||||
compatible = "atmel,maxtouch";
|
||||
reg = <0x4a>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&touchscreen_pins>;
|
||||
|
||||
+ reset-gpios = <&gpio6 13 GPIO_ACTIVE_HIGH>; /* gpio173 */
|
||||
+
|
||||
/* gpio_183 with sys_nirq2 pad as wakeup */
|
||||
- interrupts-extended = <&gpio6 23 IRQ_TYPE_EDGE_FALLING
|
||||
- &omap4_pmx_core 0x160>;
|
||||
+ interrupts-extended = <&gpio6 23 IRQ_TYPE_EDGE_FALLING>,
|
||||
+ <&omap4_pmx_core 0x160>;
|
||||
interrupt-names = "irq", "wakeup";
|
||||
wakeup-source;
|
||||
};
|
||||
@@ -484,6 +473,7 @@
|
||||
|
||||
touchscreen_pins: pinmux_touchscreen_pins {
|
||||
pinctrl-single,pins = <
|
||||
+ OMAP4_IOPAD(0x180, PIN_OUTPUT | MUX_MODE3)
|
||||
OMAP4_IOPAD(0x1a0, PIN_INPUT_PULLUP | MUX_MODE3)
|
||||
>;
|
||||
};
|
||||
--
|
||||
2.15.1
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
From 7561ba59ec083593412b8794dd3221fdca2ab49e Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
Date: Mon, 24 Jul 2017 19:33:07 +0200
|
||||
Subject: [PATCH 10/17] drm/omap: panel-dsi-cm: add physical size support
|
||||
|
||||
Add support to load physical size information from DT using
|
||||
the properties defined by the common panel binding.
|
||||
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
---
|
||||
drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c | 19 +++++++++++++++++++
|
||||
1 file changed, 19 insertions(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
|
||||
index b98ea9e..8459139 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
|
||||
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
|
||||
@@ -66,6 +66,9 @@ struct panel_drv_data {
|
||||
|
||||
bool use_dsi_backlight;
|
||||
|
||||
+ int width_mm;
|
||||
+ int height_mm;
|
||||
+
|
||||
struct omap_dsi_pin_config pin_config;
|
||||
|
||||
/* runtime variables */
|
||||
@@ -1163,6 +1166,15 @@ static int dsicm_check_timings(struct omap_dss_device *dssdev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static void dsicm_get_size(struct omap_dss_device *dssdev,
|
||||
+ unsigned int *width, unsigned int *height)
|
||||
+{
|
||||
+ struct panel_drv_data *ddata = to_panel_data(dssdev);
|
||||
+
|
||||
+ *width = ddata->width_mm;
|
||||
+ *height = ddata->height_mm;
|
||||
+}
|
||||
+
|
||||
static struct omap_dss_driver dsicm_ops = {
|
||||
.connect = dsicm_connect,
|
||||
.disconnect = dsicm_disconnect,
|
||||
@@ -1175,6 +1187,7 @@ static struct omap_dss_driver dsicm_ops = {
|
||||
|
||||
.get_timings = dsicm_get_timings,
|
||||
.check_timings = dsicm_check_timings,
|
||||
+ .get_size = dsicm_get_size,
|
||||
|
||||
.enable_te = dsicm_enable_te,
|
||||
.get_te = dsicm_get_te,
|
||||
@@ -1216,6 +1229,12 @@ static int dsicm_probe_of(struct platform_device *pdev)
|
||||
"failed to get video timing, using defaults\n");
|
||||
}
|
||||
|
||||
+ ddata->width_mm = 0;
|
||||
+ of_property_read_u32(node, "width-mm", &ddata->width_mm);
|
||||
+
|
||||
+ ddata->height_mm = 0;
|
||||
+ of_property_read_u32(node, "height-mm", &ddata->height_mm);
|
||||
+
|
||||
in = omapdss_of_find_source_for_first_ep(node);
|
||||
if (IS_ERR(in)) {
|
||||
dev_err(&pdev->dev, "failed to find video source\n");
|
||||
--
|
||||
2.1.4
|
||||
|
||||
|
|
@ -0,0 +1,247 @@
|
|||
From ed924fc352d6e2caa0d3fc1be1f1c65a35c9343b Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
Date: Mon, 24 Jul 2017 19:33:08 +0200
|
||||
Subject: [PATCH 11/17] drm/omap: panel-dsi-cm: add external backlight support
|
||||
|
||||
Droid 4 has a command mode DSI panel, which does not have/use
|
||||
DSI based backlight support. This adds proper support for this
|
||||
using a backlight phandle property, which follows the common
|
||||
panel binding.
|
||||
|
||||
If no backlight phandle is found, it is assumed, that the
|
||||
native backlight should be used instead. This is used by
|
||||
the Nokia N950.
|
||||
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
---
|
||||
drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c | 91 ++++++++++++++++---------
|
||||
1 file changed, 60 insertions(+), 31 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
|
||||
index 8459139..d139bb7 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
|
||||
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
|
||||
@@ -51,6 +51,7 @@ struct panel_drv_data {
|
||||
struct mutex lock;
|
||||
|
||||
struct backlight_device *bldev;
|
||||
+ struct backlight_device *extbldev;
|
||||
|
||||
unsigned long hw_guard_end; /* next value of jiffies when we can
|
||||
* issue the next sleep in/out command
|
||||
@@ -100,6 +101,30 @@ static int dsicm_panel_reset(struct panel_drv_data *ddata);
|
||||
|
||||
static void dsicm_ulps_work(struct work_struct *work);
|
||||
|
||||
+static void dsicm_bl_power(struct panel_drv_data *ddata, bool enable)
|
||||
+{
|
||||
+ struct backlight_device *backlight;
|
||||
+
|
||||
+ if (ddata->bldev)
|
||||
+ backlight = ddata->bldev;
|
||||
+ else if (ddata->extbldev)
|
||||
+ backlight = ddata->extbldev;
|
||||
+ else
|
||||
+ return;
|
||||
+
|
||||
+ if (enable) {
|
||||
+ backlight->props.fb_blank = FB_BLANK_UNBLANK;
|
||||
+ backlight->props.state = ~(BL_CORE_FBBLANK | BL_CORE_SUSPENDED);
|
||||
+ backlight->props.power = FB_BLANK_UNBLANK;
|
||||
+ } else {
|
||||
+ backlight->props.fb_blank = FB_BLANK_NORMAL;
|
||||
+ backlight->props.power = FB_BLANK_POWERDOWN;
|
||||
+ backlight->props.state |= BL_CORE_FBBLANK | BL_CORE_SUSPENDED;
|
||||
+ }
|
||||
+
|
||||
+ backlight_update_status(backlight);
|
||||
+}
|
||||
+
|
||||
static void hw_guard_start(struct panel_drv_data *ddata, int guard_msec)
|
||||
{
|
||||
ddata->hw_guard_wait = msecs_to_jiffies(guard_msec);
|
||||
@@ -343,7 +368,7 @@ static int dsicm_bl_update_status(struct backlight_device *dev)
|
||||
{
|
||||
struct panel_drv_data *ddata = dev_get_drvdata(&dev->dev);
|
||||
struct omap_dss_device *in = ddata->in;
|
||||
- int r;
|
||||
+ int r = 0;
|
||||
int level;
|
||||
|
||||
if (dev->props.fb_blank == FB_BLANK_UNBLANK &&
|
||||
@@ -364,8 +389,6 @@ static int dsicm_bl_update_status(struct backlight_device *dev)
|
||||
r = dsicm_dcs_write_1(ddata, DCS_BRIGHTNESS, level);
|
||||
|
||||
in->ops.dsi->bus_unlock(in);
|
||||
- } else {
|
||||
- r = 0;
|
||||
}
|
||||
|
||||
mutex_unlock(&ddata->lock);
|
||||
@@ -819,6 +842,8 @@ static int dsicm_enable(struct omap_dss_device *dssdev)
|
||||
|
||||
mutex_unlock(&ddata->lock);
|
||||
|
||||
+ dsicm_bl_power(ddata, true);
|
||||
+
|
||||
return 0;
|
||||
err:
|
||||
dev_dbg(&ddata->pdev->dev, "enable failed\n");
|
||||
@@ -834,6 +859,8 @@ static void dsicm_disable(struct omap_dss_device *dssdev)
|
||||
|
||||
dev_dbg(&ddata->pdev->dev, "disable\n");
|
||||
|
||||
+ dsicm_bl_power(ddata, false);
|
||||
+
|
||||
mutex_lock(&ddata->lock);
|
||||
|
||||
dsicm_cancel_ulps_work(ddata);
|
||||
@@ -1198,6 +1225,7 @@ static struct omap_dss_driver dsicm_ops = {
|
||||
static int dsicm_probe_of(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
+ struct device_node *backlight;
|
||||
struct panel_drv_data *ddata = platform_get_drvdata(pdev);
|
||||
struct omap_dss_device *in;
|
||||
struct display_timing timing;
|
||||
@@ -1259,14 +1287,25 @@ static int dsicm_probe_of(struct platform_device *pdev)
|
||||
|
||||
ddata->in = in;
|
||||
|
||||
- /* TODO: ulps, backlight */
|
||||
+ backlight = of_parse_phandle(node, "backlight", 0);
|
||||
+ if (backlight) {
|
||||
+ ddata->extbldev = of_find_backlight_by_node(backlight);
|
||||
+ of_node_put(backlight);
|
||||
+
|
||||
+ if (!ddata->extbldev)
|
||||
+ return -EPROBE_DEFER;
|
||||
+ } else {
|
||||
+ /* assume native backlight support */
|
||||
+ ddata->use_dsi_backlight = true;
|
||||
+ }
|
||||
+
|
||||
+ /* TODO: ulps */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dsicm_probe(struct platform_device *pdev)
|
||||
{
|
||||
- struct backlight_properties props;
|
||||
struct panel_drv_data *ddata;
|
||||
struct backlight_device *bldev = NULL;
|
||||
struct device *dev = &pdev->dev;
|
||||
@@ -1319,7 +1358,7 @@ static int dsicm_probe(struct platform_device *pdev)
|
||||
GPIOF_OUT_INIT_LOW, "taal rst");
|
||||
if (r) {
|
||||
dev_err(dev, "failed to request reset gpio\n");
|
||||
- return r;
|
||||
+ goto err_reg;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1328,7 +1367,7 @@ static int dsicm_probe(struct platform_device *pdev)
|
||||
GPIOF_IN, "taal irq");
|
||||
if (r) {
|
||||
dev_err(dev, "GPIO request failed\n");
|
||||
- return r;
|
||||
+ goto err_reg;
|
||||
}
|
||||
|
||||
r = devm_request_irq(dev, gpio_to_irq(ddata->ext_te_gpio),
|
||||
@@ -1338,7 +1377,7 @@ static int dsicm_probe(struct platform_device *pdev)
|
||||
|
||||
if (r) {
|
||||
dev_err(dev, "IRQ request failed\n");
|
||||
- return r;
|
||||
+ goto err_reg;
|
||||
}
|
||||
|
||||
INIT_DEFERRABLE_WORK(&ddata->te_timeout_work,
|
||||
@@ -1348,48 +1387,43 @@ static int dsicm_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
ddata->workqueue = create_singlethread_workqueue("dsicm_wq");
|
||||
- if (ddata->workqueue == NULL) {
|
||||
- dev_err(dev, "can't create workqueue\n");
|
||||
- return -ENOMEM;
|
||||
+ if (!ddata->workqueue) {
|
||||
+ r = -ENOMEM;
|
||||
+ goto err_reg;
|
||||
}
|
||||
INIT_DELAYED_WORK(&ddata->ulps_work, dsicm_ulps_work);
|
||||
|
||||
dsicm_hw_reset(ddata);
|
||||
|
||||
if (ddata->use_dsi_backlight) {
|
||||
- memset(&props, 0, sizeof(props));
|
||||
+ struct backlight_properties props = { 0 };
|
||||
props.max_brightness = 255;
|
||||
-
|
||||
props.type = BACKLIGHT_RAW;
|
||||
- bldev = backlight_device_register(dev_name(dev),
|
||||
- dev, ddata, &dsicm_bl_ops, &props);
|
||||
+
|
||||
+ bldev = devm_backlight_device_register(dev, dev_name(dev),
|
||||
+ dev, ddata, &dsicm_bl_ops, &props);
|
||||
if (IS_ERR(bldev)) {
|
||||
r = PTR_ERR(bldev);
|
||||
goto err_bl;
|
||||
}
|
||||
|
||||
ddata->bldev = bldev;
|
||||
-
|
||||
- bldev->props.fb_blank = FB_BLANK_UNBLANK;
|
||||
- bldev->props.power = FB_BLANK_UNBLANK;
|
||||
- bldev->props.brightness = 255;
|
||||
-
|
||||
- dsicm_bl_update_status(bldev);
|
||||
}
|
||||
|
||||
r = sysfs_create_group(&dev->kobj, &dsicm_attr_group);
|
||||
if (r) {
|
||||
dev_err(dev, "failed to create sysfs files\n");
|
||||
- goto err_sysfs_create;
|
||||
+ goto err_bl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
-err_sysfs_create:
|
||||
- backlight_device_unregister(bldev);
|
||||
err_bl:
|
||||
destroy_workqueue(ddata->workqueue);
|
||||
err_reg:
|
||||
+ if (ddata->extbldev)
|
||||
+ put_device(&ddata->extbldev->dev);
|
||||
+
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -1397,7 +1431,6 @@ static int __exit dsicm_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct panel_drv_data *ddata = platform_get_drvdata(pdev);
|
||||
struct omap_dss_device *dssdev = &ddata->dssdev;
|
||||
- struct backlight_device *bldev;
|
||||
|
||||
dev_dbg(&pdev->dev, "remove\n");
|
||||
|
||||
@@ -1408,12 +1441,8 @@ static int __exit dsicm_remove(struct platform_device *pdev)
|
||||
|
||||
sysfs_remove_group(&pdev->dev.kobj, &dsicm_attr_group);
|
||||
|
||||
- bldev = ddata->bldev;
|
||||
- if (bldev != NULL) {
|
||||
- bldev->props.power = FB_BLANK_POWERDOWN;
|
||||
- dsicm_bl_update_status(bldev);
|
||||
- backlight_device_unregister(bldev);
|
||||
- }
|
||||
+ if (ddata->extbldev)
|
||||
+ put_device(&ddata->extbldev->dev);
|
||||
|
||||
omap_dss_put_device(ddata->in);
|
||||
|
||||
--
|
||||
2.1.4
|
||||
|
||||
|
|
@ -0,0 +1,172 @@
|
|||
From d4b696beecee6b132c024e847dc54efee05f3ccc Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
Date: Mon, 24 Jul 2017 19:33:09 +0200
|
||||
Subject: [PATCH 12/17] drm/omap: panel-dsi-cm: switch to gpiod
|
||||
|
||||
Use the new descriptor based GPIO API instead of
|
||||
the legacy one, which results in cleaner code
|
||||
with less lines of code.
|
||||
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
---
|
||||
drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c | 74 +++++++++----------------
|
||||
1 file changed, 27 insertions(+), 47 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
|
||||
index d139bb7..996991d 100644
|
||||
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
|
||||
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
|
||||
@@ -22,7 +22,6 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/of_device.h>
|
||||
-#include <linux/of_gpio.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
|
||||
#include <video/mipi_display.h>
|
||||
@@ -59,8 +58,8 @@ struct panel_drv_data {
|
||||
unsigned long hw_guard_wait; /* max guard time in jiffies */
|
||||
|
||||
/* panel HW configuration from DT or platform data */
|
||||
- int reset_gpio;
|
||||
- int ext_te_gpio;
|
||||
+ struct gpio_desc *reset_gpio;
|
||||
+ struct gpio_desc *ext_te_gpio;
|
||||
|
||||
struct regulator *vpnl;
|
||||
struct regulator *vddi;
|
||||
@@ -288,8 +287,8 @@ static int dsicm_enter_ulps(struct panel_drv_data *ddata)
|
||||
if (r)
|
||||
goto err;
|
||||
|
||||
- if (gpio_is_valid(ddata->ext_te_gpio))
|
||||
- disable_irq(gpio_to_irq(ddata->ext_te_gpio));
|
||||
+ if (ddata->ext_te_gpio)
|
||||
+ disable_irq(gpiod_to_irq(ddata->ext_te_gpio));
|
||||
|
||||
in->ops.dsi->disable(in, false, true);
|
||||
|
||||
@@ -330,8 +329,8 @@ static int dsicm_exit_ulps(struct panel_drv_data *ddata)
|
||||
goto err2;
|
||||
}
|
||||
|
||||
- if (gpio_is_valid(ddata->ext_te_gpio))
|
||||
- enable_irq(gpio_to_irq(ddata->ext_te_gpio));
|
||||
+ if (ddata->ext_te_gpio)
|
||||
+ enable_irq(gpiod_to_irq(ddata->ext_te_gpio));
|
||||
|
||||
dsicm_queue_ulps_work(ddata);
|
||||
|
||||
@@ -344,8 +343,8 @@ static int dsicm_exit_ulps(struct panel_drv_data *ddata)
|
||||
|
||||
r = dsicm_panel_reset(ddata);
|
||||
if (!r) {
|
||||
- if (gpio_is_valid(ddata->ext_te_gpio))
|
||||
- enable_irq(gpio_to_irq(ddata->ext_te_gpio));
|
||||
+ if (ddata->ext_te_gpio)
|
||||
+ enable_irq(gpiod_to_irq(ddata->ext_te_gpio));
|
||||
ddata->ulps_enabled = false;
|
||||
}
|
||||
err1:
|
||||
@@ -591,16 +590,13 @@ static const struct attribute_group dsicm_attr_group = {
|
||||
|
||||
static void dsicm_hw_reset(struct panel_drv_data *ddata)
|
||||
{
|
||||
- if (!gpio_is_valid(ddata->reset_gpio))
|
||||
- return;
|
||||
-
|
||||
- gpio_set_value(ddata->reset_gpio, 1);
|
||||
+ gpiod_set_value(ddata->reset_gpio, 1);
|
||||
udelay(10);
|
||||
/* reset the panel */
|
||||
- gpio_set_value(ddata->reset_gpio, 0);
|
||||
+ gpiod_set_value(ddata->reset_gpio, 0);
|
||||
/* assert reset */
|
||||
udelay(10);
|
||||
- gpio_set_value(ddata->reset_gpio, 1);
|
||||
+ gpiod_set_value(ddata->reset_gpio, 1);
|
||||
/* wait after releasing reset */
|
||||
usleep_range(5000, 10000);
|
||||
}
|
||||
@@ -954,7 +950,7 @@ static int dsicm_update(struct omap_dss_device *dssdev,
|
||||
if (r)
|
||||
goto err;
|
||||
|
||||
- if (ddata->te_enabled && gpio_is_valid(ddata->ext_te_gpio)) {
|
||||
+ if (ddata->te_enabled && ddata->ext_te_gpio) {
|
||||
schedule_delayed_work(&ddata->te_timeout_work,
|
||||
msecs_to_jiffies(250));
|
||||
atomic_set(&ddata->do_update, 1);
|
||||
@@ -1001,7 +997,7 @@ static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable)
|
||||
else
|
||||
r = dsicm_dcs_write_0(ddata, MIPI_DCS_SET_TEAR_OFF);
|
||||
|
||||
- if (!gpio_is_valid(ddata->ext_te_gpio))
|
||||
+ if (!ddata->ext_te_gpio)
|
||||
in->ops.dsi->enable_te(in, enable);
|
||||
|
||||
/* possible panel bug */
|
||||
@@ -1229,21 +1225,21 @@ static int dsicm_probe_of(struct platform_device *pdev)
|
||||
struct panel_drv_data *ddata = platform_get_drvdata(pdev);
|
||||
struct omap_dss_device *in;
|
||||
struct display_timing timing;
|
||||
- int gpio, err;
|
||||
+ int err;
|
||||
|
||||
- gpio = of_get_named_gpio(node, "reset-gpios", 0);
|
||||
- if (!gpio_is_valid(gpio)) {
|
||||
- dev_err(&pdev->dev, "failed to parse reset gpio\n");
|
||||
- return gpio;
|
||||
+ ddata->reset_gpio = devm_gpiod_get(&pdev->dev, "reset", GPIOD_OUT_LOW);
|
||||
+ if (IS_ERR(ddata->reset_gpio)) {
|
||||
+ err = PTR_ERR(ddata->reset_gpio);
|
||||
+ dev_err(&pdev->dev, "reset gpio request failed: %d", err);
|
||||
+ return err;
|
||||
}
|
||||
- ddata->reset_gpio = gpio;
|
||||
|
||||
- gpio = of_get_named_gpio(node, "te-gpios", 0);
|
||||
- if (gpio_is_valid(gpio) || gpio == -ENOENT) {
|
||||
- ddata->ext_te_gpio = gpio;
|
||||
- } else {
|
||||
- dev_err(&pdev->dev, "failed to parse TE gpio\n");
|
||||
- return gpio;
|
||||
+ ddata->ext_te_gpio = devm_gpiod_get_optional(&pdev->dev, "te",
|
||||
+ GPIOD_IN);
|
||||
+ if (IS_ERR(ddata->ext_te_gpio)) {
|
||||
+ err = PTR_ERR(ddata->ext_te_gpio);
|
||||
+ dev_err(&pdev->dev, "TE gpio request failed: %d", err);
|
||||
+ return err;
|
||||
}
|
||||
|
||||
err = of_get_display_timing(node, "panel-timing", &timing);
|
||||
@@ -1353,24 +1349,8 @@ static int dsicm_probe(struct platform_device *pdev)
|
||||
|
||||
atomic_set(&ddata->do_update, 0);
|
||||
|
||||
- if (gpio_is_valid(ddata->reset_gpio)) {
|
||||
- r = devm_gpio_request_one(dev, ddata->reset_gpio,
|
||||
- GPIOF_OUT_INIT_LOW, "taal rst");
|
||||
- if (r) {
|
||||
- dev_err(dev, "failed to request reset gpio\n");
|
||||
- goto err_reg;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- if (gpio_is_valid(ddata->ext_te_gpio)) {
|
||||
- r = devm_gpio_request_one(dev, ddata->ext_te_gpio,
|
||||
- GPIOF_IN, "taal irq");
|
||||
- if (r) {
|
||||
- dev_err(dev, "GPIO request failed\n");
|
||||
- goto err_reg;
|
||||
- }
|
||||
-
|
||||
- r = devm_request_irq(dev, gpio_to_irq(ddata->ext_te_gpio),
|
||||
+ if (ddata->ext_te_gpio) {
|
||||
+ r = devm_request_irq(dev, gpiod_to_irq(ddata->ext_te_gpio),
|
||||
dsicm_te_isr,
|
||||
IRQF_TRIGGER_RISING,
|
||||
"taal vsync", ddata);
|
||||
--
|
||||
2.1.4
|
||||
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
From caebc72b95edde23e564f221f09d11148c8526fd Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
Date: Mon, 24 Jul 2017 19:33:10 +0200
|
||||
Subject: [PATCH 13/17] ARM: dts: omap4-droid4: improve LCD description
|
||||
|
||||
This improves LCD support for the Droid 4.
|
||||
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
---
|
||||
arch/arm/boot/dts/omap4-droid4-xt894.dts | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm/boot/dts/omap4-droid4-xt894.dts b/arch/arm/boot/dts/omap4-droid4-xt894.dts
|
||||
index 8b93d37..4620b20 100644
|
||||
--- a/arch/arm/boot/dts/omap4-droid4-xt894.dts
|
||||
+++ b/arch/arm/boot/dts/omap4-droid4-xt894.dts
|
||||
@@ -176,6 +176,10 @@
|
||||
vddi-supply = <&lcd_regulator>;
|
||||
reset-gpios = <&gpio4 5 GPIO_ACTIVE_HIGH>; /* gpio101 */
|
||||
|
||||
+ width-mm = <50>;
|
||||
+ height-mm = <89>;
|
||||
+ backlight = <&lcd_backlight>;
|
||||
+
|
||||
panel-timing {
|
||||
clock-frequency = <0>; /* Calculated by dsi */
|
||||
|
||||
@@ -345,7 +349,7 @@
|
||||
|
||||
enable-gpios = <&gpio6 12 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
- backlight {
|
||||
+ lcd_backlight: backlight {
|
||||
compatible = "ti,lm3532-backlight";
|
||||
|
||||
lcd {
|
||||
--
|
||||
2.1.4
|
||||
|
||||
|
|
@ -0,0 +1,122 @@
|
|||
From e2e3c533158df1e24c6172a2d5f83d7a4b96db16 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
Date: Mon, 24 Jul 2017 19:33:11 +0200
|
||||
Subject: [PATCH 14/17] ARM: dts: n950: add display support
|
||||
|
||||
Add basic panel support for the Nokia N950. It must be tweaked a
|
||||
little bit later, since the panel was built into the device
|
||||
upside-down. Also the first 5 and the last 5 pixels are covered
|
||||
by plastic.
|
||||
|
||||
Signed-off-By: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
Acked-by: Pavel Machek <pavel@ucw.cz>
|
||||
---
|
||||
arch/arm/boot/dts/omap3-n950.dts | 88 ++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 88 insertions(+)
|
||||
|
||||
diff --git a/arch/arm/boot/dts/omap3-n950.dts b/arch/arm/boot/dts/omap3-n950.dts
|
||||
index 646601a..ef70aae 100644
|
||||
--- a/arch/arm/boot/dts/omap3-n950.dts
|
||||
+++ b/arch/arm/boot/dts/omap3-n950.dts
|
||||
@@ -51,6 +51,26 @@
|
||||
};
|
||||
};
|
||||
|
||||
+&omap3_pmx_core {
|
||||
+ dsi_pins: pinmux_dsi_pins {
|
||||
+ pinctrl-single,pins = <
|
||||
+ OMAP3_CORE1_IOPAD(0x20dc, PIN_OUTPUT | MUX_MODE1) /* dsi_dx0 - data0+ */
|
||||
+ OMAP3_CORE1_IOPAD(0x20de, PIN_OUTPUT | MUX_MODE1) /* dsi_dy0 - data0- */
|
||||
+ OMAP3_CORE1_IOPAD(0x20e0, PIN_OUTPUT | MUX_MODE1) /* dsi_dx1 - clk+ */
|
||||
+ OMAP3_CORE1_IOPAD(0x20e2, PIN_OUTPUT | MUX_MODE1) /* dsi_dy1 - clk- */
|
||||
+ OMAP3_CORE1_IOPAD(0x20e4, PIN_OUTPUT | MUX_MODE1) /* dsi_dx2 - data1+ */
|
||||
+ OMAP3_CORE1_IOPAD(0x20e6, PIN_OUTPUT | MUX_MODE1) /* dsi_dy2 - data1- */
|
||||
+ >;
|
||||
+ };
|
||||
+
|
||||
+ display_pins: pinmux_display_pins {
|
||||
+ pinctrl-single,pins = <
|
||||
+ OMAP3_CORE1_IOPAD(0x20ca, PIN_INPUT | MUX_MODE4) /* gpio 62 - display te */
|
||||
+ OMAP3_CORE1_IOPAD(0x20fe, PIN_OUTPUT | MUX_MODE4) /* gpio 87 - display reset */
|
||||
+ >;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&i2c2 {
|
||||
smia_1: camera@10 {
|
||||
compatible = "nokia,smia";
|
||||
@@ -185,3 +205,71 @@
|
||||
st,max-limit-y = <32>;
|
||||
st,max-limit-z = <32>;
|
||||
};
|
||||
+
|
||||
+&dss {
|
||||
+ status = "ok";
|
||||
+
|
||||
+ vdda_video-supply = <&vdac>;
|
||||
+};
|
||||
+
|
||||
+&dsi {
|
||||
+ status = "ok";
|
||||
+
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&dsi_pins>;
|
||||
+
|
||||
+ vdd-supply = <&vpll2>;
|
||||
+
|
||||
+ port {
|
||||
+ dsi_out_ep: endpoint {
|
||||
+ remote-endpoint = <&lcd0_in>;
|
||||
+ lanes = <2 3 0 1 4 5>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ lcd0: display {
|
||||
+ compatible = "nokia,himalaya", "panel-dsi-cm";
|
||||
+ label = "lcd0";
|
||||
+
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&display_pins>;
|
||||
+
|
||||
+ vpnl-supply = <&vmmc2>;
|
||||
+ vddi-supply = <&vio>;
|
||||
+
|
||||
+ reset-gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>; /* 87 */
|
||||
+ te-gpios = <&gpio2 30 GPIO_ACTIVE_HIGH>; /* 62 */
|
||||
+
|
||||
+ width-mm = <49>; /* 48.960 mm */
|
||||
+ height-mm = <88>; /* 88.128 mm */
|
||||
+
|
||||
+ /* TODO:
|
||||
+ * - panel is upside-down
|
||||
+ * - top + bottom 5px are not visible
|
||||
+ */
|
||||
+ panel-timing {
|
||||
+ clock-frequency = <0>; /* Calculated by dsi */
|
||||
+
|
||||
+ hback-porch = <2>;
|
||||
+ hactive = <480>;
|
||||
+ hfront-porch = <0>;
|
||||
+ hsync-len = <2>;
|
||||
+
|
||||
+ vback-porch = <1>;
|
||||
+ vactive = <864>;
|
||||
+ vfront-porch = <0>;
|
||||
+ vsync-len = <1>;
|
||||
+
|
||||
+ hsync-active = <0>;
|
||||
+ vsync-active = <0>;
|
||||
+ de-active = <1>;
|
||||
+ pixelclk-active = <1>;
|
||||
+ };
|
||||
+
|
||||
+ port {
|
||||
+ lcd0_in: endpoint {
|
||||
+ remote-endpoint = <&dsi_out_ep>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
--
|
||||
2.1.4
|
||||
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
From ce34e7400299f5130f4f78bf3e894905373bc3c3 Mon Sep 17 00:00:00 2001
|
||||
From: Milo Kim <Milo.Kim@ti.com>
|
||||
Date: Mon, 17 Jul 2017 15:39:55 +0200
|
||||
Subject: [PATCH 15/17] dt-bindings: backlight: add ti-lmu-backlight binding
|
||||
|
||||
Add DT binding for ti-lmu devices.
|
||||
|
||||
Signed-off-by: Milo Kim <milo.kim@ti.com>
|
||||
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
|
||||
---
|
||||
.../bindings/leds/backlight/ti-lmu-backlight.txt | 66 ++++++++++++++++++++++
|
||||
1 file changed, 66 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/leds/backlight/ti-lmu-backlight.txt
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/leds/backlight/ti-lmu-backlight.txt b/Documentation/devicetree/bindings/leds/backlight/ti-lmu-backlight.txt
|
||||
new file mode 100644
|
||||
index 0000000..5fb1458
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/leds/backlight/ti-lmu-backlight.txt
|
||||
@@ -0,0 +1,66 @@
|
||||
+TI LMU backlight device tree bindings
|
||||
+
|
||||
+Required property:
|
||||
+ - compatible: Should be one of:
|
||||
+ "ti,lm3532-backlight"
|
||||
+ "ti,lm3631-backlight"
|
||||
+ "ti,lm3632-backlight"
|
||||
+ "ti,lm3633-backlight"
|
||||
+ "ti,lm3695-backlight"
|
||||
+ "ti,lm3697-backlight"
|
||||
+
|
||||
+Optional properties:
|
||||
+ There are two backlight control mode. One is I2C, the other is PWM mode.
|
||||
+ Following properties are only specified in PWM mode.
|
||||
+ Please note that LMU backlight device can have only one PWM channel.
|
||||
+
|
||||
+ - pwms: OF device-tree PWM specification.
|
||||
+ - pwm-names: a list of names for the PWM devices specified in the "pwms"
|
||||
+ property.
|
||||
+
|
||||
+ For the PWM user nodes, please refer to [1].
|
||||
+
|
||||
+Child nodes:
|
||||
+ LMU backlight is represented as sub-nodes of the TI LMU device [2].
|
||||
+ So, LMU backlight should have more than one backlight child node.
|
||||
+ Each node exactly matches with backlight control bank configuration.
|
||||
+ Maximum numbers of child nodes depend on the device.
|
||||
+
|
||||
+ 1 = LM3631, LM3632, LM3695
|
||||
+ 2 = LM3633, LM3697
|
||||
+ 3 = LM3532
|
||||
+
|
||||
+ Required property of a child node:
|
||||
+ - led-sources: List of enabled channels from 0 to 2.
|
||||
+ Please refer to LED binding [3].
|
||||
+ For output channels, please refer to the datasheets [4].
|
||||
+
|
||||
+ Optional properties of a child node:
|
||||
+ - label: Backlight channel identification.
|
||||
+ Please refer to LED binding [3].
|
||||
+ - default-brightness-level: Backlight initial brightness value.
|
||||
+ Type is <u32>. It is set as soon as backlight
|
||||
+ device is created.
|
||||
+ 0 ~ 2047 = LM3631, LM3632, LM3633, LM3695 and
|
||||
+ LM3697
|
||||
+ 0 ~ 255 = LM3532
|
||||
+ - ramp-up-msec, ramp-down-msec: Light dimming effect properties.
|
||||
+ Type is <u32>. Unit is millisecond.
|
||||
+ 0 ~ 65 msec = LM3532
|
||||
+ 0 ~ 4000 msec = LM3631
|
||||
+ 0 ~ 16000 msec = LM3633 and LM3697
|
||||
+ - pwm-period: PWM period. Only valid in PWM brightness mode.
|
||||
+ Type is <u32>. If this property is missing, then control
|
||||
+ mode is set to I2C by default.
|
||||
+
|
||||
+Examples: Please refer to ti-lmu dt-bindings. [2].
|
||||
+
|
||||
+[1] ../pwm/pwm.txt
|
||||
+[2] ../mfd/ti-lmu.txt
|
||||
+[3] ../leds/common.txt
|
||||
+[4] LM3532: http://www.ti.com/product/LM3532/datasheet
|
||||
+ LM3631: http://www.ti.com/product/LM3631/datasheet
|
||||
+ LM3632: http://www.ti.com/product/LM3632A/datasheet
|
||||
+ LM3633: http://www.ti.com/product/LM3633/datasheet
|
||||
+ LM3695: Datasheet is not opened yet, but only two strings are used.
|
||||
+ LM3697: http://www.ti.com/product/LM3697/datasheet
|
||||
--
|
||||
2.1.4
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,102 @@
|
|||
From 4f23bc7bf13c779f3640a3bf68ce688a98d434b8 Mon Sep 17 00:00:00 2001
|
||||
From: Tony Lindgren <tony@atomide.com>
|
||||
Date: Wed, 25 Oct 2017 15:07:32 -0700
|
||||
Subject: [PATCH 17/17] droid4 hdmi on 4.14-rc4+
|
||||
|
||||
* Merlijn Wajer <merlijn@wizzup.org> [171025 14:54]:
|
||||
> Hi,
|
||||
>
|
||||
> I have been trying to get HDMI to work on the Motorola Droid4, as I saw
|
||||
> that it should be supported. When I enable DRM_OMAP, OMAP4_DSS_HDMI and
|
||||
> DRM_OMAP_CONNECTOR_HDMI, I don't get any output on HDMI (Full config
|
||||
> here [1], for Linux 4.14-rc4). I see this in dmesg (repeatedly) [2]:
|
||||
>
|
||||
> [ 21.360321] of_get_named_gpiod_flags: parsed 'hpd-gpios' property of
|
||||
> node '/connector[0]' - status (0)
|
||||
> [ 21.370147] connector-hdmi connector: failed to find video source
|
||||
>
|
||||
> My hunch is that perhaps something is missing in the device tree, but
|
||||
> after looking for time in the omapdrm code I cannot figure it out. Am I
|
||||
> perhaps missing some configuration options?
|
||||
>
|
||||
> I also do not seem to have any /dev/dri entries, although I did expect
|
||||
> to see them.
|
||||
|
||||
Hmm I've been using it a lot over past six months with lapdock with
|
||||
typically updating to Linux next about once a week or every few weeks.
|
||||
I'm just using pending LCD and backlight patches, and omap2plus_defconfig
|
||||
with following patch. Maybe see if you're missing something from that
|
||||
patch?
|
||||
|
||||
Also Tomi pointed out earlier that n900 needed the analog tv module
|
||||
loaded for LCD output.. I wonder if you need also the pending LCD
|
||||
patches applied?
|
||||
|
||||
Cheers,
|
||||
|
||||
Tony
|
||||
|
||||
> [1] http://sprunge.us/GIhC
|
||||
> [2] http://sprunge.us/bXWf
|
||||
|
||||
8< -------------------------
|
||||
---
|
||||
arch/arm/configs/omap2plus_defconfig | 38 ++++++++++++++++++++----------------
|
||||
1 file changed, 21 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig
|
||||
index 7b97200..59d8c14 100644
|
||||
--- a/arch/arm/configs/omap2plus_defconfig
|
||||
+++ b/arch/arm/configs/omap2plus_defconfig
|
||||
@@ -318,27 +318,31 @@ CONFIG_V4L_PLATFORM_DRIVERS=y
|
||||
CONFIG_VIDEO_OMAP3=m
|
||||
# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set
|
||||
CONFIG_VIDEO_TVP5150=m
|
||||
+CONFIG_DRM=m
|
||||
+CONFIG_DRM_OMAP=m
|
||||
+CONFIG_DRM_OMAP_NUM_CRTCS=2
|
||||
+CONFIG_OMAP5_DSS_HDMI=y
|
||||
+CONFIG_OMAP2_DSS_SDI=y
|
||||
+CONFIG_OMAP2_DSS_DSI=y
|
||||
+CONFIG_DRM_OMAP_ENCODER_OPA362=m
|
||||
+CONFIG_DRM_OMAP_ENCODER_TFP410=m
|
||||
+CONFIG_DRM_OMAP_ENCODER_TPD12S015=m
|
||||
+CONFIG_DRM_OMAP_CONNECTOR_DVI=m
|
||||
+CONFIG_DRM_OMAP_CONNECTOR_HDMI=m
|
||||
+CONFIG_DRM_OMAP_CONNECTOR_ANALOG_TV=m
|
||||
+CONFIG_DRM_OMAP_PANEL_DPI=m
|
||||
+CONFIG_DRM_OMAP_PANEL_DSI_CM=m
|
||||
+CONFIG_DRM_OMAP_PANEL_SONY_ACX565AKM=m
|
||||
+CONFIG_DRM_OMAP_PANEL_LGPHILIPS_LB035Q02=m
|
||||
+CONFIG_DRM_OMAP_PANEL_SHARP_LS037V7DW01=m
|
||||
+CONFIG_DRM_OMAP_PANEL_TPO_TD028TTEC1=m
|
||||
+CONFIG_DRM_OMAP_PANEL_TPO_TD043MTEA1=m
|
||||
+CONFIG_DRM_OMAP_PANEL_NEC_NL8048HL11=m
|
||||
+CONFIG_DRM_TILCDC=m
|
||||
CONFIG_FB=y
|
||||
CONFIG_FIRMWARE_EDID=y
|
||||
CONFIG_FB_MODE_HELPERS=y
|
||||
CONFIG_FB_TILEBLITTING=y
|
||||
-CONFIG_FB_OMAP2=m
|
||||
-CONFIG_FB_OMAP5_DSS_HDMI=y
|
||||
-CONFIG_FB_OMAP2_DSS_SDI=y
|
||||
-CONFIG_FB_OMAP2_DSS_DSI=y
|
||||
-CONFIG_FB_OMAP2_ENCODER_TFP410=m
|
||||
-CONFIG_FB_OMAP2_ENCODER_TPD12S015=m
|
||||
-CONFIG_FB_OMAP2_CONNECTOR_DVI=m
|
||||
-CONFIG_FB_OMAP2_CONNECTOR_HDMI=m
|
||||
-CONFIG_FB_OMAP2_CONNECTOR_ANALOG_TV=m
|
||||
-CONFIG_FB_OMAP2_PANEL_DPI=m
|
||||
-CONFIG_FB_OMAP2_PANEL_DSI_CM=m
|
||||
-CONFIG_FB_OMAP2_PANEL_SONY_ACX565AKM=m
|
||||
-CONFIG_FB_OMAP2_PANEL_LGPHILIPS_LB035Q02=m
|
||||
-CONFIG_FB_OMAP2_PANEL_SHARP_LS037V7DW01=m
|
||||
-CONFIG_FB_OMAP2_PANEL_TPO_TD028TTEC1=m
|
||||
-CONFIG_FB_OMAP2_PANEL_TPO_TD043MTEA1=m
|
||||
-CONFIG_FB_OMAP2_PANEL_NEC_NL8048HL11=m
|
||||
CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
||||
CONFIG_LCD_CLASS_DEVICE=y
|
||||
CONFIG_LCD_PLATFORM=y
|
||||
--
|
||||
2.1.4
|
||||
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
https://www.spinics.net/lists/linux-omap/msg141500.html
|
||||
|
||||
Hi,
|
||||
|
||||
These are the remaining patches from my previous patchset to get
|
||||
Droid 4 (omap4) display working. The patches have been rebased to
|
||||
current master branch from Torvalds (581e400ff935). Since N950
|
||||
(omap3) is broken even with the workaround I moved it to the end,
|
||||
so that it can be skipped.
|
||||
|
||||
Working on Droid 4:
|
||||
* Framebuffer Console, updated at 1Hz due to blinking cursor
|
||||
* kmstest (static image)
|
||||
* Display blanking
|
||||
* Xorg with omap and modesetting driver
|
||||
* No updates send when nothing needs to be sent
|
||||
* Orientation DRM property is attached to the DSI panel
|
||||
|
||||
Known issues:
|
||||
* N950 (omap3) is broken. I have updated the omap3 fifo workaround,
|
||||
but it's not enough to fix omap3.
|
||||
* N950 (and N9) has first and last few lines covered by plastic, so
|
||||
we should expose a smaller screen
|
||||
|
||||
Changes since PATCHv1:
|
||||
* Drop patches, that were queued by Tomi
|
||||
* Rebase to current master
|
||||
* Rework the omap3 workaround patch to only affect omap3
|
||||
* Add orientation DRM property support
|
||||
|
||||
-- Sebastian
|
||||
|
||||
|
||||
Sebastian Reichel (8):
|
||||
drm/omap: add framedone interrupt support
|
||||
drm/omap: add manual update detection helper
|
||||
drm/omap: add support for manually updated displays
|
||||
dt-bindings: panel: common: document orientation property
|
||||
drm/omap: add support for orientation hints from display drivers
|
||||
drm/omap: panel-dsi-cm: add orientation support
|
||||
ARM: dts: omap4-droid4: Add LCD panel orientation property
|
||||
drm/omap: plane: update fifo size on ovl setup
|
||||
|
||||
.../bindings/display/panel/panel-common.txt | 12 ++
|
||||
arch/arm/boot/dts/omap4-droid4-xt894.dts | 3 +
|
||||
drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c | 13 ++
|
||||
drivers/gpu/drm/omapdrm/dss/dispc.c | 36 ++++-
|
||||
drivers/gpu/drm/omapdrm/dss/omapdss.h | 2 +
|
||||
drivers/gpu/drm/omapdrm/omap_connector.c | 18 ++-
|
||||
drivers/gpu/drm/omapdrm/omap_connector.h | 1 +
|
||||
drivers/gpu/drm/omapdrm/omap_crtc.c | 158 +++++++++++++++++++--
|
||||
drivers/gpu/drm/omapdrm/omap_crtc.h | 2 +
|
||||
drivers/gpu/drm/omapdrm/omap_fb.c | 20 +++
|
||||
drivers/gpu/drm/omapdrm/omap_irq.c | 24 ++++
|
||||
drivers/gpu/drm/omapdrm/omap_irq.h | 1 +
|
||||
include/dt-bindings/display/common.h | 14 ++
|
||||
13 files changed, 294 insertions(+), 10 deletions(-)
|
||||
create mode 100644 include/dt-bindings/display/common.h
|
||||
|
||||
--
|
||||
2.15.1
|
||||
Loading…
Reference in New Issue