Unverified Commit ee0285e1 authored by Adam Ford's avatar Adam Ford Committed by Robert Foss
Browse files

drm/bridge: adv7533: Fix adv7533_mode_valid for adv7533 and adv7535



When dynamically switching lanes was removed, the intent of the code
was to check to make sure that higher speed items used 4 lanes, but
it had the unintended consequence of removing the slower speeds for
4-lane users.

This attempts to remedy this by doing a check to see that the
max frequency doesn't exceed the chip limit, and a second
check to make sure that the max bit-rate doesn't exceed the
number of lanes * max bit rate / lane.

Fixes: 9a0cdcd6 ("drm/bridge: adv7533: remove dynamic lane switching from adv7533 bridge")
Reviewed-by: default avatarRobert Foss <rfoss@kernel.org>
Signed-off-by: default avatarAdam Ford <aford173@gmail.com>
Signed-off-by: default avatarRobert Foss <rfoss@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20230319125524.58803-1-aford173@gmail.com
parent 5327469e
Loading
Loading
Loading
Loading
+11 −14
Original line number Diff line number Diff line
@@ -103,22 +103,19 @@ void adv7533_dsi_power_off(struct adv7511 *adv)
enum drm_mode_status adv7533_mode_valid(struct adv7511 *adv,
					const struct drm_display_mode *mode)
{
	int lanes;
	unsigned long max_lane_freq;
	struct mipi_dsi_device *dsi = adv->dsi;
	u8 bpp = mipi_dsi_pixel_format_to_bpp(dsi->format);

	if (mode->clock > 80000)
		lanes = 4;
	else
		lanes = 3;
	/* Check max clock for either 7533 or 7535 */
	if (mode->clock > (adv->type == ADV7533 ? 80000 : 148500))
		return MODE_CLOCK_HIGH;

	/*
	 * TODO: add support for dynamic switching of lanes
	 * by using the bridge pre_enable() op . Till then filter
	 * out the modes which shall need different number of lanes
	 * than what was configured in the device tree.
	 */
	if (lanes != dsi->lanes)
		return MODE_BAD;
	/* Check max clock for each lane */
	max_lane_freq = (adv->type == ADV7533 ? 800000 : 891000);

	if (mode->clock * bpp > max_lane_freq * adv->num_dsi_lanes)
		return MODE_CLOCK_HIGH;

	return MODE_OK;
}