drm/panel: Add helper for reading DT rotation
This adds a helper function for reading the rotation (panel orientation) from the device tree. Reviewed-by: Sam Ravnborg <sam@ravnborg.org> Tested-by: Dmitry Osipenko <digetx@gmail.com> Signed-off-by: Derek Basehore <dbasehore@chromium.org> Signed-off-by: Dmitry Osipenko <digetx@gmail.com> Signed-off-by: Sam Ravnborg <sam@ravnborg.org> Link: https://patchwork.freedesktop.org/patch/msgid/20200813215609.28643-2-digetx@gmail.com
This commit is contained in:
Родитель
1c243751c0
Коммит
5f3e7503b9
|
@ -260,6 +260,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. Return a negative error code on failure.
|
||||
*/
|
||||
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)
|
||||
|
|
|
@ -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
|
||||
*
|
||||
|
@ -188,11 +190,19 @@ 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) || \
|
||||
|
|
Загрузка…
Ссылка в новой задаче