Panel rotation patches
Subsystems (5)
v12 cover Panel rotation patches
Hello!
This series adds support for display panel's DT rotation property. It's a continuation of the work that was initially started by Derek Basehore for the panel driver that is used by some Mediatek device [1]. I picked up the Derek's patches and added my t-b and r-b tags to them, I also added rotation support to the panel-lvds and panel-simple drivers.
We need the rotation support for the Nexus 7 tablet device which is now supported by the upstream kernel, the device has display panel mounted upside-down and it uses panel-lvds [2].
[1] https://lkml.org/lkml/2020/3/5/1119
[2] https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/tree/arch/arm/boot/dts/tegra30-asus-nexus7-grouper-common.dtsi?#n1036
Changelog:
v12: - No code changes. The v11 missed v5.9 release, re-sending patches
for the v5.10 kernel. Please review and apply patches to linux-next, thanks in advance!
v11: - This series is factored out from this patchset [3] because these
patches do not have hard dependency on the Tegra DRM patches and it should be nicer to review and apply the properly grouped patches.
- Initially [3] only touched the panel-lvds driver and Emil Velikov suggested that it will be better to support more panels in the review comments to [3]. So I included the Derek's patch for the BOE panel and added rotation support to the panel-simple driver. I tested that panel-lvds and panel-simple work properly with the rotated panel using the Opentegra Xorg driver [4] and Wayland Weston [5].
- The panel-lvds driver now prints a error message if rotation property fails to be parsed.
[3] https://lore.kernel.org/lkml/[email protected]/
[4] https://github.com/grate-driver/xf86-video-opentegra/commit/28eb20a3959bbe5bc3a3b67e55977093fd5114ca
[5] https://gitlab.freedesktop.org/wayland/weston/-/merge_requests/315
Derek Basehore (2):
drm/panel: Add helper for reading DT rotation drm/panel: Read panel orientation for BOE TV101WUM-NL6
Dmitry Osipenko (2):
drm/panel: lvds: Read panel orientation
drm/panel-simple: Read panel orientation
drivers/gpu/drm/drm_panel.c | 43 +++++++++++++++++++ .../gpu/drm/panel/panel-boe-tv101wum-nl6.c | 6 +++ drivers/gpu/drm/panel/panel-lvds.c | 10 +++++ drivers/gpu/drm/panel/panel-simple.c | 11 +++++ include/drm/drm_panel.h | 9 ++++ 5 files changed, 79 insertions(+)
Signature · 1 line
2.27.0
PATCH RESEND v12 1/4 drm/panel: Add helper for reading DT rotation
From: Derek Basehore <[email protected]>
This adds a helper function for reading the rotation (panel orientation) from the device tree.
--- drivers/gpu/drm/drm_panel.c | 43 +++++++++++++++++++++++++++++++++++++ include/drm/drm_panel.h | 9 ++++++++ 2 files changed, 52 insertions(+)
drivers/gpu/drm/drm_panel.c +43 -0
@@ -300,6 +300,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 #if IS_REACHABLE (CONFIG_BACKLIGHT_CLASS_DEVICE )
include/drm/drm_panel.h +9 -0
@@ -35,6 +35,8 @@ struct drm_device;struct drm_panel ;struct display_timing ; +enum drm_panel_orientation ; +/** * struct drm_panel_funcs - perform operations on a given panel *
@@ -191,11 +193,18 @@ int drm_panel_get_modes(struct drm_panel *panel, struct drm_connector *connector#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 #if IS_ENABLED(CONFIG_DRM_PANEL) && (IS_BUILTIN(CONFIG_BACKLIGHT_CLASS_DEVICE) || \
Signature · 1 line
2.27.0
PATCH RESEND v12 2/4 drm/panel: Read panel orientation for BOE TV101WUM-NL6
In reply to Dmitry OsipenkoFrom: Derek Basehore <[email protected]>
This reads the DT setting for the panel rotation to set the panel orientation in the get_modes callback.
--- drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c +6 -0
@@ -11,6 +11,7 @@#include <linux/of_device.h> #include <linux/regulator/consumer.h> +#include <drm/drm_connector.h> #include <drm/drm_crtc.h> #include <drm/drm_mipi_dsi.h> #include <drm/drm_panel.h>
@@ -43,6 +44,7 @@ struct boe_panel {const struct panel_desc *desc; +enum drm_panel_orientation orientation;struct regulator *pp1800;struct regulator *avee;struct regulator *avdd;
@@ -740,6 +742,7 @@ static int boe_panel_get_modes(struct drm_panel *panel, connector->display_info.width_mm = boe->desc->size.width_mm; connector->display_info.height_mm = boe->desc->size.height_mm; connector->display_info.bpc = boe->desc->bpc; +drm_connector_set_panel_orientation (connector, boe->orientation);return 1 ; }
@@ -779,6 +782,9 @@ static int boe_panel_add(struct boe_panel *boe)drm_panel_init (&boe->base, dev, &boe_panel_funcs,DRM_MODE_CONNECTOR_DSI ); + err =of_drm_get_panel_orientation (dev->of_node, &boe->orientation); +if (err <0 ) +return err; err =drm_panel_of_backlight (&boe->base);if (err)
Signature · 1 line
2.27.0
PATCH RESEND v12 3/4 drm/panel: lvds: Read panel orientation
In reply to Dmitry OsipenkoThe panel orientation needs to parsed from a device-tree and assigned to the panel's connector in order to make orientation property available to userspace. That's what this patch does for the generic LVDS panel.
--- drivers/gpu/drm/panel/panel-lvds.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/gpu/drm/panel/panel-lvds.c +10 -0
@@ -37,6 +37,8 @@ struct panel_lvds {struct gpio_desc *enable_gpio;struct gpio_desc *reset_gpio; + +enum drm_panel_orientation orientation; };static inline struct panel_lvds *to_panel_lvds (struct drm_panel *panel)
@@ -99,6 +101,7 @@ static int panel_lvds_get_modes(struct drm_panel *panel, connector->display_info.bus_flags = lvds->data_mirror ?DRM_BUS_FLAG_DATA_LSB_TO_MSB :DRM_BUS_FLAG_DATA_MSB_TO_LSB ; +drm_connector_set_panel_orientation (connector, lvds->orientation);return 1 ; }
@@ -116,6 +119,13 @@ static int panel_lvds_parse_dt(struct panel_lvds *lvds)const char *mapping;int ret; + ret =of_drm_get_panel_orientation (np, &lvds->orientation); +if (ret <0 ) { +dev_err (lvds->dev,"%pOF: problems parsing rotation (%d)\n" , + np, ret); +return ret; + } + ret =of_get_display_timing (np,"panel-timing" , &timing);if (ret <0 ) { dev_err(lvds->dev, "%pOF: problems parsing panel-timing (%d)\n",
Signature · 1 line
2.27.0
PATCH RESEND v12 4/4 drm/panel-simple: Read panel orientation
In reply to Dmitry OsipenkoThe panel orientation needs to parsed from a device-tree and assigned to the panel's connector in order to make orientation property available to userspace. That's what this patch does for the panel-simple driver.
--- drivers/gpu/drm/panel/panel-simple.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/gpu/drm/panel/panel-simple.c +11 -0
@@ -112,6 +112,8 @@ struct panel_simple {struct gpio_desc *hpd_gpio;struct drm_display_mode override_mode; + +enum drm_panel_orientation orientation; };static inline struct panel_simple *to_panel_simple (struct drm_panel *panel)
@@ -371,6 +373,9 @@ static int panel_simple_get_modes(struct drm_panel *panel,/* add hard-coded panel modes */ num +=panel_simple_get_non_edid_modes (p, connector); +/* set up connector's "panel orientation" property */ +drm_connector_set_panel_orientation (connector, p->orientation); +return num; }
@@ -530,6 +535,12 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)return err; } + err =of_drm_get_panel_orientation (dev->of_node, &panel->orientation); +if (err) { +dev_err (dev,"failed to parse rotation property: %d\n" , err); +return err; + } + ddc =of_parse_phandle (dev->of_node,"ddc-i2c-bus" ,0 );if (ddc) { panel->ddc =of_find_i2c_adapter_by_node (ddc);
Signature · 1 line
2.27.0
Hi Dmitry
Quoted 39 lines · Dmitry Osipenko
Hello!
This series adds support for display panel's DT rotation property. It's a continuation of the work that was initially started by Derek Basehore for the panel driver that is used by some Mediatek device [1]. I picked up the Derek's patches and added my t-b and r-b tags to them, I also added rotation support to the panel-lvds and panel-simple drivers.
We need the rotation support for the Nexus 7 tablet device which is now supported by the upstream kernel, the device has display panel mounted upside-down and it uses panel-lvds [2].
[1] https://lkml.org/lkml/2020/3/5/1119
[2] https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/tree/arch/arm/boot/dts/tegra30-asus-nexus7-grouper-common.dtsi?#n1036Changelog:
v12: - No code changes. The v11 missed v5.9 release, re-sending patches
for the v5.10 kernel. Please review and apply patches to linux-next, thanks in advance!v11: - This series is factored out from this patchset [3] because these
patches do not have hard dependency on the Tegra DRM patches and it should be nicer to review and apply the properly grouped patches.- Initially [3] only touched the panel-lvds driver and Emil Velikov suggested that it will be better to support more panels in the review comments to [3]. So I included the Derek's patch for the BOE panel and added rotation support to the panel-simple driver. I tested that panel-lvds and panel-simple work properly with the rotated panel using the Opentegra Xorg driver [4] and Wayland Weston [5].
- The panel-lvds driver now prints a error message if rotation property fails to be parsed.
[3] https://lore.kernel.org/lkml/[email protected]/
[4] https://github.com/grate-driver/xf86-video-opentegra/commit/28eb20a3959bbe5bc3a3b67e55977093fd5114ca
[5] https://gitlab.freedesktop.org/wayland/weston/-/merge_requests/315
Quoted 7 lines
Derek Basehore (2):
drm/panel: Add helper for reading DT rotation drm/panel: Read panel orientation for BOE TV101WUM-NL6Dmitry Osipenko (2):
drm/panel: lvds: Read panel orientation
drm/panel-simple: Read panel orientation
Thanks for your persistence with these patches.
While applying I made a few updates:
- fixed two trivial checkpatch warnings
- small update to kernel-doc for the new function, to better match surrounding wording
- added error message to panel-boe-tv101wum-nl6.c when failed to get orientation
- use same wording in all error messages and use "orientation" and not rotation as this matches the called function
Sam
Quoted 10 lines
drivers/gpu/drm/drm_panel.c | 43 +++++++++++++++++++ .../gpu/drm/panel/panel-boe-tv101wum-nl6.c | 6 +++ drivers/gpu/drm/panel/panel-lvds.c | 10 +++++ drivers/gpu/drm/panel/panel-simple.c | 11 +++++ include/drm/drm_panel.h | 9 ++++ 5 files changed, 79 insertions(+)Signature · 1 line
2.27.0
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
16.08.2020 18:17, Sam Ravnborg пишет:
Quoted 50 lines
Hi Dmitry
Quoted 39 lines · Dmitry Osipenko
Hello!
This series adds support for display panel's DT rotation property. It's a continuation of the work that was initially started by Derek Basehore for the panel driver that is used by some Mediatek device [1]. I picked up the Derek's patches and added my t-b and r-b tags to them, I also added rotation support to the panel-lvds and panel-simple drivers.
We need the rotation support for the Nexus 7 tablet device which is now supported by the upstream kernel, the device has display panel mounted upside-down and it uses panel-lvds [2].
[1] https://lkml.org/lkml/2020/3/5/1119
[2] https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/tree/arch/arm/boot/dts/tegra30-asus-nexus7-grouper-common.dtsi?#n1036Changelog:
v12: - No code changes. The v11 missed v5.9 release, re-sending patches
for the v5.10 kernel. Please review and apply patches to linux-next, thanks in advance!v11: - This series is factored out from this patchset [3] because these
patches do not have hard dependency on the Tegra DRM patches and it should be nicer to review and apply the properly grouped patches.- Initially [3] only touched the panel-lvds driver and Emil Velikov suggested that it will be better to support more panels in the review comments to [3]. So I included the Derek's patch for the BOE panel and added rotation support to the panel-simple driver. I tested that panel-lvds and panel-simple work properly with the rotated panel using the Opentegra Xorg driver [4] and Wayland Weston [5].
- The panel-lvds driver now prints a error message if rotation property fails to be parsed.
[3] https://lore.kernel.org/lkml/[email protected]/
[4] https://github.com/grate-driver/xf86-video-opentegra/commit/28eb20a3959bbe5bc3a3b67e55977093fd5114ca
[5] https://gitlab.freedesktop.org/wayland/weston/-/merge_requests/315Quoted 7 lines
Derek Basehore (2):
drm/panel: Add helper for reading DT rotation drm/panel: Read panel orientation for BOE TV101WUM-NL6Dmitry Osipenko (2):
drm/panel: lvds: Read panel orientation
drm/panel-simple: Read panel orientation
Quoted 9 lines
Thanks for your persistence with these patches.
While applying I made a few updates:
- fixed two trivial checkpatch warnings
- small update to kernel-doc for the new function, to better match surrounding wording
- added error message topanel-boe-tv101wum-nl6.cwhen failed to get orientation
- use same wording in all error messages and use "orientation" and not rotation as this matches the called function
Hello, Sam! Very nice to see the progress! Thank you very much!