#ifdef CONFIG_DRM_I2C_ADV7533
void adv7533_dsi_power_on(struct adv7511 *adv);
void adv7533_dsi_power_off(struct adv7511 *adv);
+void adv7533_mode_set(struct adv7511 *adv, struct drm_display_mode *mode);
+bool adv7533_mode_fixup(struct adv7511 *adv, struct drm_display_mode *mode);
int adv7533_patch_registers(struct adv7511 *adv);
int adv7533_patch_cec_registers(struct adv7511 *adv);
int adv7533_attach_dsi(struct adv7511 *adv);
{
}
+static inline bool adv7533_mode_fixup(struct adv7511 *adv,
+ struct drm_display_mode *mode)
+{
+ return true;
+}
+
static inline int adv7533_patch_registers(struct adv7511 *adv)
{
return -ENODEV;
adv7511_mode_set(adv, mode, adj_mode);
}
+static bool adv7511_bridge_mode_fixup(struct drm_bridge *bridge,
+ const struct drm_display_mode *mode,
+ struct drm_display_mode *adjusted_mode)
+{
+ struct adv7511 *adv = bridge_to_adv7511(bridge);
+
+ if (adv->type == ADV7533 || adv->type == ADV7535)
+ return adv7533_mode_fixup(adv, adjusted_mode);
+
+ return true;
+}
+
static int adv7511_bridge_attach(struct drm_bridge *bridge)
{
struct adv7511 *adv = bridge_to_adv7511(bridge);
.enable = adv7511_bridge_enable,
.disable = adv7511_bridge_disable,
.mode_set = adv7511_bridge_mode_set,
+ .mode_fixup = adv7511_bridge_mode_fixup,
.attach = adv7511_bridge_attach,
};
regmap_write(adv->regmap_cec, 0x27, 0x0b);
}
+void adv7533_mode_set(struct adv7511 *adv, struct drm_display_mode *mode)
+{
+}
+
+bool adv7533_mode_fixup(struct adv7511 *adv,
+ struct drm_display_mode *mode)
+{
+ struct mipi_dsi_device *dsi = adv->dsi;
+ int lanes, ret;
+
+ if (adv->num_dsi_lanes != 4)
+ return true;
+
+ if (mode->clock > 80000)
+ lanes = 4;
+ else
+ lanes = 3;
+
+ if (lanes != dsi->lanes) {
+ mipi_dsi_detach(dsi);
+ swap(dsi->lanes, lanes);
+ ret = mipi_dsi_attach(dsi);
+ if (ret) {
+ dev_err(&dsi->dev, "failed to change host lanes\n");
+ swap(dsi->lanes, lanes);
+ return false;
+ }
+ }
+
+ return true;
+}
+
int adv7533_patch_registers(struct adv7511 *adv)
{
return regmap_register_patch(adv->regmap,