On Mon, Oct 7, 2019 at 9:38 AM Sean Paul sean@poorly.run wrote:
On Wed, Sep 25, 2019 at 03:58:30PM -0700, Derek Basehore wrote:
This adds a helper function for reading the rotation (panel orientation) from the device tree.
Signed-off-by: Derek Basehore dbasehore@chromium.org Reviewed-by: Sam Ravnborg sam@ravnborg.org
The patch LGTM, but I don't see it used anywhere later in the patch? Is there a panel driver incoming?
Yeah, the boe-tv101wum-nl6 panel will use it. It's not in the patch currently sent upstream since I don't want to step on their toes, but I plan on sending a patch to add it as soon as that is merged.
I could hold back on this patch until that panel driver is merged too. Another alternative is to throw this into the generic drm_panel code, but there's no obvious place to put it since DRM seems to leave reading the DTS up to the panel drivers themselves.
Sean
drivers/gpu/drm/drm_panel.c | 43 +++++++++++++++++++++++++++++++++++++ include/drm/drm_panel.h | 9 ++++++++ 2 files changed, 52 insertions(+)
diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c index 6b0bf42039cf..0909b53b74e6 100644 --- a/drivers/gpu/drm/drm_panel.c +++ b/drivers/gpu/drm/drm_panel.c @@ -264,6 +264,49 @@ struct drm_panel *of_drm_find_panel(const struct device_node *np) return ERR_PTR(-EPROBE_DEFER); } EXPORT_SYMBOL(of_drm_find_panel);
+/**
- of_drm_get_panel_orientation - look up the orientation of the panel through
- the "rotation" binding from a device tree node
- @np: device tree node of the panel
- @orientation: orientation enum to be filled in
- Looks up the rotation of a panel in the device tree. The orientation of the
- panel is expressed as a property name "rotation" in the device tree. The
- rotation in the device tree is counter clockwise.
- Return: 0 when a valid rotation value (0, 90, 180, or 270) is read or the
- rotation property doesn't exist. -EERROR otherwise.
- */
+int of_drm_get_panel_orientation(const struct device_node *np,
enum drm_panel_orientation *orientation)
+{
int rotation, ret;
ret = of_property_read_u32(np, "rotation", &rotation);
if (ret == -EINVAL) {
/* Don't return an error if there's no rotation property. */
*orientation = DRM_MODE_PANEL_ORIENTATION_UNKNOWN;
return 0;
}
if (ret < 0)
return ret;
if (rotation == 0)
*orientation = DRM_MODE_PANEL_ORIENTATION_NORMAL;
else if (rotation == 90)
*orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP;
else if (rotation == 180)
*orientation = DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP;
else if (rotation == 270)
*orientation = DRM_MODE_PANEL_ORIENTATION_LEFT_UP;
else
return -EINVAL;
return 0;
+} +EXPORT_SYMBOL(of_drm_get_panel_orientation); #endif
MODULE_AUTHOR("Thierry Reding treding@nvidia.com"); diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h index 624bd15ecfab..d16158deacdc 100644 --- a/include/drm/drm_panel.h +++ b/include/drm/drm_panel.h @@ -34,6 +34,8 @@ struct drm_device; struct drm_panel; struct display_timing;
+enum drm_panel_orientation;
/**
- struct drm_panel_funcs - perform operations on a given panel
@@ -165,11 +167,18 @@ int drm_panel_get_modes(struct drm_panel *panel);
#if defined(CONFIG_OF) && defined(CONFIG_DRM_PANEL) struct drm_panel *of_drm_find_panel(const struct device_node *np); +int of_drm_get_panel_orientation(const struct device_node *np,
enum drm_panel_orientation *orientation);
#else static inline struct drm_panel *of_drm_find_panel(const struct device_node *np) { return ERR_PTR(-ENODEV); } +static inline int of_drm_get_panel_orientation(const struct device_node *np,
enum drm_panel_orientation *orientation)
+{
return -ENODEV;
+} #endif
#endif
2.23.0.351.gc4317032e6-goog
-- Sean Paul, Software Engineer, Google / Chromium OS