drm/connector: Share with non-atomic drivers the function to get the single encoder
This 3 non-atomic drivers all have the same function getting the
only encoder available in the connector, also atomic drivers have
this fallback. So moving it a common place and sharing between atomic
and non-atomic drivers.
While at it I also removed the mention of
drm_atomic_helper_best_encoder() that was renamed in
commit 297e30b5d9
("drm/atomic-helper: Unexport
drm_atomic_helper_best_encoder").
v3: moving drm_connector_get_single_encoder to drm_kms_helper module
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Suggested-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: dri-devel@lists.freedesktop.org
Cc: intel-gfx@lists.freedesktop.org
Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
Signed-off-by: Manasi Navare <manasi.d.navare@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190913232857.389834-1-jose.souza@intel.com
This commit is contained in:
parent
37d212622a
commit
a92462d6bf
@ -687,17 +687,6 @@ static void ast_encoder_destroy(struct drm_encoder *encoder)
|
|||||||
kfree(encoder);
|
kfree(encoder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct drm_encoder *ast_best_single_encoder(struct drm_connector *connector)
|
|
||||||
{
|
|
||||||
int enc_id = connector->encoder_ids[0];
|
|
||||||
/* pick the encoder ids */
|
|
||||||
if (enc_id)
|
|
||||||
return drm_encoder_find(connector->dev, NULL, enc_id);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static const struct drm_encoder_funcs ast_enc_funcs = {
|
static const struct drm_encoder_funcs ast_enc_funcs = {
|
||||||
.destroy = ast_encoder_destroy,
|
.destroy = ast_encoder_destroy,
|
||||||
};
|
};
|
||||||
@ -847,7 +836,6 @@ static void ast_connector_destroy(struct drm_connector *connector)
|
|||||||
static const struct drm_connector_helper_funcs ast_connector_helper_funcs = {
|
static const struct drm_connector_helper_funcs ast_connector_helper_funcs = {
|
||||||
.mode_valid = ast_mode_valid,
|
.mode_valid = ast_mode_valid,
|
||||||
.get_modes = ast_get_modes,
|
.get_modes = ast_get_modes,
|
||||||
.best_encoder = ast_best_single_encoder,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct drm_connector_funcs ast_connector_funcs = {
|
static const struct drm_connector_funcs ast_connector_funcs = {
|
||||||
|
@ -97,17 +97,6 @@ drm_atomic_helper_plane_changed(struct drm_atomic_state *state,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* For connectors that support multiple encoders, either the
|
|
||||||
* .atomic_best_encoder() or .best_encoder() operation must be implemented.
|
|
||||||
*/
|
|
||||||
static struct drm_encoder *
|
|
||||||
pick_single_encoder_for_connector(struct drm_connector *connector)
|
|
||||||
{
|
|
||||||
WARN_ON(connector->encoder_ids[1]);
|
|
||||||
return drm_encoder_find(connector->dev, NULL, connector->encoder_ids[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int handle_conflicting_encoders(struct drm_atomic_state *state,
|
static int handle_conflicting_encoders(struct drm_atomic_state *state,
|
||||||
bool disable_conflicting_encoders)
|
bool disable_conflicting_encoders)
|
||||||
{
|
{
|
||||||
@ -135,7 +124,7 @@ static int handle_conflicting_encoders(struct drm_atomic_state *state,
|
|||||||
else if (funcs->best_encoder)
|
else if (funcs->best_encoder)
|
||||||
new_encoder = funcs->best_encoder(connector);
|
new_encoder = funcs->best_encoder(connector);
|
||||||
else
|
else
|
||||||
new_encoder = pick_single_encoder_for_connector(connector);
|
new_encoder = drm_connector_get_single_encoder(connector);
|
||||||
|
|
||||||
if (new_encoder) {
|
if (new_encoder) {
|
||||||
if (encoder_mask & drm_encoder_mask(new_encoder)) {
|
if (encoder_mask & drm_encoder_mask(new_encoder)) {
|
||||||
@ -359,7 +348,7 @@ update_connector_routing(struct drm_atomic_state *state,
|
|||||||
else if (funcs->best_encoder)
|
else if (funcs->best_encoder)
|
||||||
new_encoder = funcs->best_encoder(connector);
|
new_encoder = funcs->best_encoder(connector);
|
||||||
else
|
else
|
||||||
new_encoder = pick_single_encoder_for_connector(connector);
|
new_encoder = drm_connector_get_single_encoder(connector);
|
||||||
|
|
||||||
if (!new_encoder) {
|
if (!new_encoder) {
|
||||||
DRM_DEBUG_ATOMIC("No suitable encoder found for [CONNECTOR:%d:%s]\n",
|
DRM_DEBUG_ATOMIC("No suitable encoder found for [CONNECTOR:%d:%s]\n",
|
||||||
|
@ -481,6 +481,17 @@ drm_crtc_helper_disable(struct drm_crtc *crtc)
|
|||||||
__drm_helper_disable_unused_functions(dev);
|
__drm_helper_disable_unused_functions(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For connectors that support multiple encoders, either the
|
||||||
|
* .atomic_best_encoder() or .best_encoder() operation must be implemented.
|
||||||
|
*/
|
||||||
|
struct drm_encoder *
|
||||||
|
drm_connector_get_single_encoder(struct drm_connector *connector)
|
||||||
|
{
|
||||||
|
WARN_ON(connector->encoder_ids[1]);
|
||||||
|
return drm_encoder_find(connector->dev, NULL, connector->encoder_ids[0]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* drm_crtc_helper_set_config - set a new config from userspace
|
* drm_crtc_helper_set_config - set a new config from userspace
|
||||||
* @set: mode set configuration
|
* @set: mode set configuration
|
||||||
@ -646,7 +657,11 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set,
|
|||||||
new_encoder = connector->encoder;
|
new_encoder = connector->encoder;
|
||||||
for (ro = 0; ro < set->num_connectors; ro++) {
|
for (ro = 0; ro < set->num_connectors; ro++) {
|
||||||
if (set->connectors[ro] == connector) {
|
if (set->connectors[ro] == connector) {
|
||||||
|
if (connector_funcs->best_encoder)
|
||||||
new_encoder = connector_funcs->best_encoder(connector);
|
new_encoder = connector_funcs->best_encoder(connector);
|
||||||
|
else
|
||||||
|
new_encoder = drm_connector_get_single_encoder(connector);
|
||||||
|
|
||||||
/* if we can't get an encoder for a connector
|
/* if we can't get an encoder for a connector
|
||||||
we are setting now - then fail */
|
we are setting now - then fail */
|
||||||
if (new_encoder == NULL)
|
if (new_encoder == NULL)
|
||||||
|
@ -75,3 +75,6 @@ enum drm_mode_status drm_encoder_mode_valid(struct drm_encoder *encoder,
|
|||||||
const struct drm_display_mode *mode);
|
const struct drm_display_mode *mode);
|
||||||
enum drm_mode_status drm_connector_mode_valid(struct drm_connector *connector,
|
enum drm_mode_status drm_connector_mode_valid(struct drm_connector *connector,
|
||||||
struct drm_display_mode *mode);
|
struct drm_display_mode *mode);
|
||||||
|
|
||||||
|
struct drm_encoder *
|
||||||
|
drm_connector_get_single_encoder(struct drm_connector *connector);
|
||||||
|
@ -1638,16 +1638,6 @@ static enum drm_mode_status mga_vga_mode_valid(struct drm_connector *connector,
|
|||||||
return MODE_OK;
|
return MODE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct drm_encoder *mga_connector_best_encoder(struct drm_connector
|
|
||||||
*connector)
|
|
||||||
{
|
|
||||||
int enc_id = connector->encoder_ids[0];
|
|
||||||
/* pick the encoder ids */
|
|
||||||
if (enc_id)
|
|
||||||
return drm_encoder_find(connector->dev, NULL, enc_id);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mga_connector_destroy(struct drm_connector *connector)
|
static void mga_connector_destroy(struct drm_connector *connector)
|
||||||
{
|
{
|
||||||
struct mga_connector *mga_connector = to_mga_connector(connector);
|
struct mga_connector *mga_connector = to_mga_connector(connector);
|
||||||
@ -1659,7 +1649,6 @@ static void mga_connector_destroy(struct drm_connector *connector)
|
|||||||
static const struct drm_connector_helper_funcs mga_vga_connector_helper_funcs = {
|
static const struct drm_connector_helper_funcs mga_vga_connector_helper_funcs = {
|
||||||
.get_modes = mga_vga_get_modes,
|
.get_modes = mga_vga_get_modes,
|
||||||
.mode_valid = mga_vga_mode_valid,
|
.mode_valid = mga_vga_mode_valid,
|
||||||
.best_encoder = mga_connector_best_encoder,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct drm_connector_funcs mga_vga_connector_funcs = {
|
static const struct drm_connector_funcs mga_vga_connector_funcs = {
|
||||||
|
@ -90,13 +90,6 @@ udl_detect(struct drm_connector *connector, bool force)
|
|||||||
return connector_status_connected;
|
return connector_status_connected;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct drm_encoder*
|
|
||||||
udl_best_single_encoder(struct drm_connector *connector)
|
|
||||||
{
|
|
||||||
int enc_id = connector->encoder_ids[0];
|
|
||||||
return drm_encoder_find(connector->dev, NULL, enc_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int udl_connector_set_property(struct drm_connector *connector,
|
static int udl_connector_set_property(struct drm_connector *connector,
|
||||||
struct drm_property *property,
|
struct drm_property *property,
|
||||||
uint64_t val)
|
uint64_t val)
|
||||||
@ -120,7 +113,6 @@ static void udl_connector_destroy(struct drm_connector *connector)
|
|||||||
static const struct drm_connector_helper_funcs udl_connector_helper_funcs = {
|
static const struct drm_connector_helper_funcs udl_connector_helper_funcs = {
|
||||||
.get_modes = udl_get_modes,
|
.get_modes = udl_get_modes,
|
||||||
.mode_valid = udl_mode_valid,
|
.mode_valid = udl_mode_valid,
|
||||||
.best_encoder = udl_best_single_encoder,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct drm_connector_funcs udl_connector_funcs = {
|
static const struct drm_connector_funcs udl_connector_funcs = {
|
||||||
|
@ -955,9 +955,8 @@ struct drm_connector_helper_funcs {
|
|||||||
* @atomic_best_encoder.
|
* @atomic_best_encoder.
|
||||||
*
|
*
|
||||||
* You can leave this function to NULL if the connector is only
|
* You can leave this function to NULL if the connector is only
|
||||||
* attached to a single encoder and you are using the atomic helpers.
|
* attached to a single encoder. In this case, the core will call
|
||||||
* In this case, the core will call drm_atomic_helper_best_encoder()
|
* drm_connector_get_single_encoder() for you.
|
||||||
* for you.
|
|
||||||
*
|
*
|
||||||
* RETURNS:
|
* RETURNS:
|
||||||
*
|
*
|
||||||
@ -977,7 +976,7 @@ struct drm_connector_helper_funcs {
|
|||||||
*
|
*
|
||||||
* This function is used by drm_atomic_helper_check_modeset().
|
* This function is used by drm_atomic_helper_check_modeset().
|
||||||
* If it is not implemented, the core will fallback to @best_encoder
|
* If it is not implemented, the core will fallback to @best_encoder
|
||||||
* (or drm_atomic_helper_best_encoder() if @best_encoder is NULL).
|
* (or drm_connector_get_single_encoder() if @best_encoder is NULL).
|
||||||
*
|
*
|
||||||
* NOTE:
|
* NOTE:
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user