drm/exynos: fix display power call issue.
Changelog v3: make exynos_drm_display_power function use exynos_drm_best_encoder function instead of connector->encoder to get a valid encoder. connector->encoder could be NULL because with DRM_IOCTL_MODE_RMFB request, connector->encoder is NULL so fix this issue. Changelog v2: remove static prefix so that exynos_drm_best_encoder function could be called by other modules. Changelog v1: this patch fixes the issue that display power callback isn't called. with DRM_IOCTL_MODE_RMFB request, encoder->connector becomes NULL so display_ops->power_on() wouldn't be called so this patch makes exynos_drm_best_encoder function to be used to get a valid encoder of each connector. Signed-off-by: Inki Dae <inki.dae@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
This commit is contained in:
parent
e2e1338900
commit
58f6aad7d9
|
@ -199,8 +199,7 @@ static int exynos_drm_connector_mode_valid(struct drm_connector *connector,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct drm_encoder *exynos_drm_best_encoder(
|
struct drm_encoder *exynos_drm_best_encoder(struct drm_connector *connector)
|
||||||
struct drm_connector *connector)
|
|
||||||
{
|
{
|
||||||
struct drm_device *dev = connector->dev;
|
struct drm_device *dev = connector->dev;
|
||||||
struct exynos_drm_connector *exynos_connector =
|
struct exynos_drm_connector *exynos_connector =
|
||||||
|
@ -231,7 +230,7 @@ static struct drm_connector_helper_funcs exynos_connector_helper_funcs = {
|
||||||
|
|
||||||
void exynos_drm_display_power(struct drm_connector *connector, int mode)
|
void exynos_drm_display_power(struct drm_connector *connector, int mode)
|
||||||
{
|
{
|
||||||
struct drm_encoder *encoder = connector->encoder;
|
struct drm_encoder *encoder = exynos_drm_best_encoder(connector);
|
||||||
struct exynos_drm_connector *exynos_connector;
|
struct exynos_drm_connector *exynos_connector;
|
||||||
struct exynos_drm_manager *manager = exynos_drm_get_manager(encoder);
|
struct exynos_drm_manager *manager = exynos_drm_get_manager(encoder);
|
||||||
struct exynos_drm_display_ops *display_ops = manager->display_ops;
|
struct exynos_drm_display_ops *display_ops = manager->display_ops;
|
||||||
|
|
|
@ -31,6 +31,8 @@
|
||||||
struct drm_connector *exynos_drm_connector_create(struct drm_device *dev,
|
struct drm_connector *exynos_drm_connector_create(struct drm_device *dev,
|
||||||
struct drm_encoder *encoder);
|
struct drm_encoder *encoder);
|
||||||
|
|
||||||
|
struct drm_encoder *exynos_drm_best_encoder(struct drm_connector *connector);
|
||||||
|
|
||||||
void exynos_drm_display_power(struct drm_connector *connector, int mode);
|
void exynos_drm_display_power(struct drm_connector *connector, int mode);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -57,7 +57,7 @@ static void exynos_drm_connector_power(struct drm_encoder *encoder, int mode)
|
||||||
struct drm_connector *connector;
|
struct drm_connector *connector;
|
||||||
|
|
||||||
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||||
if (connector->encoder == encoder) {
|
if (exynos_drm_best_encoder(connector) == encoder) {
|
||||||
DRM_DEBUG_KMS("connector[%d] dpms[%d]\n",
|
DRM_DEBUG_KMS("connector[%d] dpms[%d]\n",
|
||||||
connector->base.id, mode);
|
connector->base.id, mode);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue