mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-24 19:45:06 +08:00
e2f930aaa3
Since commit4a97a3da42
("drm: Don't update property values for atomic drivers") atomic drivers must not update property values as properties are read from the state instead. To catch remaining users, the drm_object_property_set_value() function now throws a warning when called by atomic drivers on non-immutable properties, and we hit that warning when creating connectors. The easy fix is to just remove the drm_object_property_set_value() as it is used here to set the initial value of the connector's DPMS property to OFF. The DPMS property applies on top of the connector's state crtc pointer (initialized to NULL) that is the main connector on/off control, and should thus default to ON. Fixes:4a97a3da42
("drm: Don't update property values for atomic drivers") Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
94 lines
2.5 KiB
C
94 lines
2.5 KiB
C
/*
|
|
* rcar_du_lvdscon.c -- R-Car Display Unit LVDS Connector
|
|
*
|
|
* Copyright (C) 2013-2014 Renesas Electronics Corporation
|
|
*
|
|
* Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com)
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*/
|
|
|
|
#include <drm/drmP.h>
|
|
#include <drm/drm_atomic_helper.h>
|
|
#include <drm/drm_crtc.h>
|
|
#include <drm/drm_crtc_helper.h>
|
|
#include <drm/drm_panel.h>
|
|
|
|
#include <video/display_timing.h>
|
|
#include <video/of_display_timing.h>
|
|
#include <video/videomode.h>
|
|
|
|
#include "rcar_du_drv.h"
|
|
#include "rcar_du_encoder.h"
|
|
#include "rcar_du_kms.h"
|
|
#include "rcar_du_lvdscon.h"
|
|
|
|
static int rcar_du_lvds_connector_get_modes(struct drm_connector *connector)
|
|
{
|
|
struct rcar_du_connector *rcon = to_rcar_connector(connector);
|
|
|
|
return drm_panel_get_modes(rcon->panel);
|
|
}
|
|
|
|
static const struct drm_connector_helper_funcs connector_helper_funcs = {
|
|
.get_modes = rcar_du_lvds_connector_get_modes,
|
|
};
|
|
|
|
static void rcar_du_lvds_connector_destroy(struct drm_connector *connector)
|
|
{
|
|
struct rcar_du_connector *rcon = to_rcar_connector(connector);
|
|
|
|
drm_panel_detach(rcon->panel);
|
|
drm_connector_cleanup(connector);
|
|
}
|
|
|
|
static const struct drm_connector_funcs connector_funcs = {
|
|
.reset = drm_atomic_helper_connector_reset,
|
|
.fill_modes = drm_helper_probe_single_connector_modes,
|
|
.destroy = rcar_du_lvds_connector_destroy,
|
|
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
|
|
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
|
|
};
|
|
|
|
int rcar_du_lvds_connector_init(struct rcar_du_device *rcdu,
|
|
struct rcar_du_encoder *renc,
|
|
const struct device_node *np)
|
|
{
|
|
struct drm_encoder *encoder = rcar_encoder_to_drm_encoder(renc);
|
|
struct rcar_du_connector *rcon;
|
|
struct drm_connector *connector;
|
|
int ret;
|
|
|
|
rcon = devm_kzalloc(rcdu->dev, sizeof(*rcon), GFP_KERNEL);
|
|
if (rcon == NULL)
|
|
return -ENOMEM;
|
|
|
|
connector = &rcon->connector;
|
|
|
|
rcon->panel = of_drm_find_panel(np);
|
|
if (!rcon->panel)
|
|
return -EPROBE_DEFER;
|
|
|
|
ret = drm_connector_init(rcdu->ddev, connector, &connector_funcs,
|
|
DRM_MODE_CONNECTOR_LVDS);
|
|
if (ret < 0)
|
|
return ret;
|
|
|
|
drm_connector_helper_add(connector, &connector_helper_funcs);
|
|
|
|
ret = drm_mode_connector_attach_encoder(connector, encoder);
|
|
if (ret < 0)
|
|
return ret;
|
|
|
|
ret = drm_panel_attach(rcon->panel, connector);
|
|
if (ret < 0)
|
|
return ret;
|
|
|
|
rcon->encoder = renc;
|
|
|
|
return 0;
|
|
}
|