drm/panel: add drm_connector argument to get_modes()
Today the bridge creates the drm_connector, but that is planned to be moved to the display drivers. To facilitate this, update drm_panel_funcs.get_modes() to take drm_connector as an argument. All panel drivers implementing get_modes() are updated. v2: - drop accidental change (Laurent) - update docs for get_modes (Laurent) Signed-off-by: Sam Ravnborg <sam@ravnborg.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Cc: Thierry Reding <thierry.reding@gmail.com> Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Cc: Maxime Ripard <mripard@kernel.org> Cc: David Airlie <airlied@linux.ie> Cc: Daniel Vetter <daniel@ffwll.ch> Cc: Linus Walleij <linus.walleij@linaro.org> Cc: Jagan Teki <jagan@amarulasolutions.com> Cc: Stefan Mavrodiev <stefan@olimex.com> Cc: Robert Chiras <robert.chiras@nxp.com> Cc: "Guido Günther" <agx@sigxcpu.org> Cc: Purism Kernel Team <kernel@puri.sm> Link: https://patchwork.freedesktop.org/patch/msgid/20191207140353.23967-6-sam@ravnborg.org
This commit is contained in:
@@ -117,9 +117,9 @@ static inline struct panel_simple *to_panel_simple(struct drm_panel *panel)
|
||||
return container_of(panel, struct panel_simple, base);
|
||||
}
|
||||
|
||||
static unsigned int panel_simple_get_timings_modes(struct panel_simple *panel)
|
||||
static unsigned int panel_simple_get_timings_modes(struct panel_simple *panel,
|
||||
struct drm_connector *connector)
|
||||
{
|
||||
struct drm_connector *connector = panel->base.connector;
|
||||
struct drm_device *drm = panel->base.drm;
|
||||
struct drm_display_mode *mode;
|
||||
unsigned int i, num = 0;
|
||||
@@ -150,9 +150,9 @@ static unsigned int panel_simple_get_timings_modes(struct panel_simple *panel)
|
||||
return num;
|
||||
}
|
||||
|
||||
static unsigned int panel_simple_get_display_modes(struct panel_simple *panel)
|
||||
static unsigned int panel_simple_get_display_modes(struct panel_simple *panel,
|
||||
struct drm_connector *connector)
|
||||
{
|
||||
struct drm_connector *connector = panel->base.connector;
|
||||
struct drm_device *drm = panel->base.drm;
|
||||
struct drm_display_mode *mode;
|
||||
unsigned int i, num = 0;
|
||||
@@ -181,9 +181,9 @@ static unsigned int panel_simple_get_display_modes(struct panel_simple *panel)
|
||||
return num;
|
||||
}
|
||||
|
||||
static int panel_simple_get_non_edid_modes(struct panel_simple *panel)
|
||||
static int panel_simple_get_non_edid_modes(struct panel_simple *panel,
|
||||
struct drm_connector *connector)
|
||||
{
|
||||
struct drm_connector *connector = panel->base.connector;
|
||||
struct drm_device *drm = panel->base.drm;
|
||||
struct drm_display_mode *mode;
|
||||
bool has_override = panel->override_mode.type;
|
||||
@@ -204,7 +204,7 @@ static int panel_simple_get_non_edid_modes(struct panel_simple *panel)
|
||||
|
||||
/* Only add timings if override was not there or failed to validate */
|
||||
if (num == 0 && panel->desc->num_timings)
|
||||
num = panel_simple_get_timings_modes(panel);
|
||||
num = panel_simple_get_timings_modes(panel, connector);
|
||||
|
||||
/*
|
||||
* Only add fixed modes if timings/override added no mode.
|
||||
@@ -214,7 +214,7 @@ static int panel_simple_get_non_edid_modes(struct panel_simple *panel)
|
||||
*/
|
||||
WARN_ON(panel->desc->num_timings && panel->desc->num_modes);
|
||||
if (num == 0)
|
||||
num = panel_simple_get_display_modes(panel);
|
||||
num = panel_simple_get_display_modes(panel, connector);
|
||||
|
||||
connector->display_info.bpc = panel->desc->bpc;
|
||||
connector->display_info.width_mm = panel->desc->size.width;
|
||||
@@ -304,23 +304,25 @@ static int panel_simple_enable(struct drm_panel *panel)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int panel_simple_get_modes(struct drm_panel *panel)
|
||||
static int panel_simple_get_modes(struct drm_panel *panel,
|
||||
struct drm_connector *connector)
|
||||
{
|
||||
struct panel_simple *p = to_panel_simple(panel);
|
||||
int num = 0;
|
||||
|
||||
/* probe EDID if a DDC bus is available */
|
||||
if (p->ddc) {
|
||||
struct edid *edid = drm_get_edid(panel->connector, p->ddc);
|
||||
drm_connector_update_edid_property(panel->connector, edid);
|
||||
struct edid *edid = drm_get_edid(connector, p->ddc);
|
||||
|
||||
drm_connector_update_edid_property(connector, edid);
|
||||
if (edid) {
|
||||
num += drm_add_edid_modes(panel->connector, edid);
|
||||
num += drm_add_edid_modes(connector, edid);
|
||||
kfree(edid);
|
||||
}
|
||||
}
|
||||
|
||||
/* add hard-coded panel modes */
|
||||
num += panel_simple_get_non_edid_modes(p);
|
||||
num += panel_simple_get_non_edid_modes(p, connector);
|
||||
|
||||
return num;
|
||||
}
|
||||
|
Reference in New Issue
Block a user